Javaのreturnステートメントの後でもfinallyブロックは実行される?徹底解説
結論:returnステートメントの後でもfinallyブロックは実行される
はい、Javaではメソッド内でreturnステートメントを実行した後でも、finallyブロックは必ず実行されます。
finallyブロックは、tryブロック内で例外が発生したかどうかにかかわらず、常に実行されることが言語仕様によって保証されています。これは、return文によって戻り値が評価・保持された後も、実際にメソッドから制御が抜ける前にfinallyブロックが処理されるためです。
finallyブロックが実行されない例外的なケース
finallyブロックが実行されないのは、基本的に次のような特殊な状況だけです。
- finallyブロック内でSystem.exit()メソッドを明示的に呼び出した場合
- JVMのクラッシュ
- 停電などの電源障害
- ソフトウェアの異常終了
これらの条件を除けば、finallyブロックは常に実行されると考えて問題ありません。リソースの解放やクローズ処理などをfinallyブロックに記述することで、確実な後処理が可能になります。
サンプルコード
以下のコードでは、tryブロック内でreturn文を実行していますが、その後もfinallyブロックが実行されることを確認できます。
public class FinallyBlockAfterReturnTest {
public static void main(String[] args) {
System.out.println(count());
}
public static int count() {
try {
return 1;
} catch(Exception e) {
return 2;
} finally {
System.out.println("メソッド内のreturnステートメントの後でもfinallyブロックは実行されます");
}
}
}
実行結果
メソッド内のreturnステートメントの後でもfinallyブロックは実行されます 1
このように、tryブロックのreturn文で戻り値「1」が返される前のタイミングで、finallyブロック内の出力処理が先に実行されていることが分かります。catchブロック内にreturn文がある場合も同様に、finallyブロックは必ず実行されます。
-
Javaの同時実行性 – Thread.yield()メソッドの仕組みと使い方
yield()メソッドとはjava.lang.Thread.yield()メソッドは、現在実行中のスレッドが自発的にCPUの使用権を手放し、より優先度の高い他のスレッドに実行の機会を譲るよう、スレッドスケジューラにヒントを伝えるためのメソッドです。処理に時間がかかっている重要度の低いスレッドよりも、優先して実行すべきスレッドを先に進めたい場面で利用されます。スレッドがyield()を呼び出すと、「自分の実行を一時停止してもよい」という合図がスケジューラに送られます。ただし、この合図を受け入れるか無視するかはスケジューラの判断に委ねられており、必ず譲るとは限らない点に注意が必要です。yield(
-
Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説
destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc