Java言語仕様によると:
try ブロックに throw ステートメントが含まれている外側の try ステートメントがある場合、それらの try ステートメントの finally 句は、スローされた値がキャッチされるまで、制御が外側に転送されるときに実行されます。finally 句が突然完了すると、throw ステートメントによって開始された制御の転送が中断される可能性があることに注意してください。
finally ブロック内に戻る以外に、他にどのような方法がありますか?
finally ブロックから例外をスローすると、元の例外 (存在する場合) も上書きされます。
編集:「突然の完了」を説明する参照が見つかりました。§14.1 から: ステートメントの通常および突然の
完了:
突然の完了には、常に次のいずれかの理由が関連付けられています。
- ラベルのない休憩
- 特定のラベルの付いた休憩
- ラベルなしの継続
- 特定のラベルで続行
- 価値のないリターン
- 指定された値を返す
- Java 仮想マシンによってスローされた例外を含む、指定された値でのスロー
最後の 3 つはfinally
、ループ内にない限り、句で使用できる唯一のものです。
Sys.exit()
または中止を強制します。特に GUI プログラムは、例外を呼び出すことで有名ですSys.exit()
。その理由の 1 つは、JVM 1.5 まで生き残ったバグ (GUI スレッドからスローされた例外がメイン スレッドに到達しなかった) です。
更新:特にこれに反対票を投じた人に。申し訳ありませんが、Sys.exit() は、スタックが巻き戻されないようにするなど、突然の終了が意味することを正確に実行します。明日、ドキュメントに対してバグを報告します。これについては、Sun で数年間シニア Java アーキテクトを務めていた権威者に話すことができます。
finally ブロックが switch ケースの一部である場合、switch 内の break ステートメントである可能性もあると思います。また、finally ブロックが他の言語で実装されたメソッドを呼び出す場合、その言語のコンパイラが喜ぶことは何でも行う可能性があります。