Java
 Computer >> コンピューター >  >> プログラミング >> Java

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ブロックは必ず実行されます。

  1. Javaの同時実行性 – Thread.yield()メソッドの仕組みと使い方

    yield()メソッドとはjava.lang.Thread.yield()メソッドは、現在実行中のスレッドが自発的にCPUの使用権を手放し、より優先度の高い他のスレッドに実行の機会を譲るよう、スレッドスケジューラにヒントを伝えるためのメソッドです。処理に時間がかかっている重要度の低いスレッドよりも、優先して実行すべきスレッドを先に進めたい場面で利用されます。スレッドがyield()を呼び出すと、「自分の実行を一時停止してもよい」という合図がスケジューラに送られます。ただし、この合図を受け入れるか無視するかはスケジューラの判断に委ねられており、必ず譲るとは限らない点に注意が必要です。yield(

  2. Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説

    destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc