<finallyブロックを実行できない可能性がある状況>
・例外がfinallyブロックの内部で派生する
・finallyブロックの実行前にSystem.exit()メソッドが呼び出される
<複数のcatchブロック>
複数のcatchブロックが定義されている場合、発生した例外と同じクラスもしくは親クラスがあるかないかを上から順に比較する。
・特定の例外に対しては、実行制御が最初に検出した1つの関連するcatchブロックしか実行されない
・catchブロックで指定した例外クラス間に継承関係がある場合、記述する順番はサブクラスからとする。この規則に従わないと、コンパイルエラーとなる 。
<例外が発生した場合のtry-catch-finallyブロックの実行フロー規則>
・例外がいずれのcatchブロックでもキャッチされなかった場合:
- finallyブロックがない場合、実行は例外発生ポイントで直ちに中止され、プログラムは停止する。
- finallyブロックがある場合、実行は例外発生ポイントからfinallyブロックに移動し、finallyブロックの後でプログラムは停止する。
・例外がcatchブロックでキャッチされた場合:
- finallyブロックがない場合、catchブロックの実行後、プログラムの実行は継続される。
- finallyブロックがある場合、catchブロックの実行後、制御はfinallyブロックに移動し、プログラムの実行は継続される。
・try,catch,finallyブロックは以下の組合せが定義可能:
- try-catch-finallyブロックを全て記述する
- try-catchブロックのみ記述する
- try-finallyブロックのみ記述する