[解決済み】 Try-finallyブロックがStackOverflowErrorを防ぐ
2022-03-25 06:55:05
質問
次の2つの方法について見てみましょう。
public static void foo() {
try {
foo();
} finally {
foo();
}
}
public static void bar() {
bar();
}
実行中
bar()
は明らかに
StackOverflowError
が、実行すると
foo()
は実行されません (プログラムが無限に実行されるように見えるだけです)。
なぜでしょうか?
解決方法は?
永遠に実行されるわけではありません。スタックオーバーフローのたびに、コードはfinallyブロックに移動します。問題は、本当に、本当に長い時間がかかるということです。時間のオーダーは O(2^N) で、ここで N は最大スタック深さである。
最大深度が5であると仮定すると
foo() calls
foo() calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
各レベルを最終ブロックに組み込むには、2倍の時間がかかり、スタックの深さは 万個以上。1秒間に10,000,000回呼び出すとすると、10^3003秒、つまり宇宙の年齢よりも長い時間がかかることになります。
関連
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
-
[解決済み] StackOverflowErrorとは何ですか?
-
[解決済み] なぜJUnitはassertNotEqualsメソッドを提供しないのですか?
-
[解決済み] メソッドは、タイプ内の別のメソッドと同じ消去を持つ
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み] try "で宣言された変数が "catch "や "finally "のスコープに入らないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] このフォーマット(Tue Jul 13 00:00:00 CEST 2010)の日付をJavaの日付に変換する方法(文字列はalfrescoのプロパティに由来しています)
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] アクティビティに割り当てられない