Javaでは、try-catch-finallyのtryブロック内にreturnステートメントを挿入すると、finallyブロックは実行されませんか?
finally
ブロックが実行されないのは、finally
に達する前にexit()
を呼び出すときだけです。 exit()
呼び出しはJVMをシャットダウンするため、後続のコード行は実行されません。
編集:これは完全に正しいわけではありません。追加情報については、以下のコメントを参照してください。
Finallyブロックは、戻っても常に実行されます。またはtryブロック内で例外がスローされます。
セクションも参照してください 14.19.2 try-catch-finallyの実行 of Java Language Specification
Finallyブロックは、これらすべての場合に実行されます。最後にブロックを最後に実行するポイントは、取得したすべてのリソースを解放できるようにすることです。
以下は、それがどのように機能するかを示す例です。
public class Hello {
public static void hello(){
try{
System.out.println("hi");
return;
}catch(RuntimeException e){
}finally{
System.out.println("finally");
}
}
public static void main(String[] args){
hello();
}
}
Tryブロック内に戻っても実行されます。 1つのreturnステートメントをtry内とfinally内に1つずつ配置しましたが、返される値はtryからではなく、最終的にのものです。
public class HelloWorld{
public static void main(String args[]){
System.out.println(printSomething());
}
public static String printSomething(){
try{
return "tried";
} finally{
return "finally";
}
}
}
私が得た出力は「最終的に」でした。
公式説明 によると:
注:tryまたはcatchコードの実行中にJVMが終了すると、finallyブロックが実行されない場合があります。同様に、tryまたはcatchコードを実行しているスレッドが中断または強制終了された場合、アプリケーション全体が継続していても、finallyブロックが実行されない場合があります。
ここに回答を投稿する前に、公式ウェブサイトを参照することをお勧めします。
Finallyブロックに戻りがある場合、try-catchブロックの戻りをオーバーライドします。この「機能」のため、finallyブロックは例外をスローしたりreturnステートメントを使用したりしないようにすることをお勧めします。
メソッドがキャッチされない例外または明示的なreturnステートメントを介して呼び出し元に戻ろうとすると、finally節もメソッドが戻る直前に実行されます。