Java では、try-catch-finally の try ブロック内に return ステートメントを挿入すると、finally ブロックは実行されませんか?
8 に答える
finally
ブロックが実行されないのは、到達exit()
する前に呼び出したときだけです。呼び出しによって JVM がシャットダウンされるため、後続のコード行は実行されませんfinally
。exit()
編集:これは完全に正しくありません。詳細については、以下のコメントを参照してください。
finally ブロックは、戻っても、try ブロック内で例外がスローされても、常に実行されます。
Java 言語仕様のセクション14.19.2 try-catch-finallyの実行も参照してください。
finally ブロックは、これらすべてのケースで実行されます。最後に 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 ブロック内で戻っても実行されます。try 内に 1 つの return ステートメントを配置し、finally 内にも 1 つの return ステートメントを配置しました。返された値は、try からではなく、finally からのものでした。
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 ブロックが実行されない可能性があります。
ここに回答を投稿する前に、公式ウェブサイトを参照することをお勧めします。
メソッドがキャッチされない例外または明示的な return ステートメントを介して呼び出し元に戻ろうとするときはいつでも、メソッドが戻る直前に finally 句も実行されます。