web-dev-qa-db-ja.com

javaでtry-catch-finally

Javaでは、try-catch-finallyのtryブロック内にreturnステートメントを挿入すると、finallyブロックは実行されませんか?

27
Nikhil

finallyブロックが実行されないのは、finallyに達する前にexit()を呼び出すときだけです。 exit()呼び出しはJVMをシャットダウンするため、後続のコード行は実行されません。

編集:これは完全に正しいわけではありません。追加情報については、以下のコメントを参照してください。

26
Gabriel Negut

Finallyブロックは、戻っても常に実行されます。またはtryブロック内で例外がスローされます。

セクションも参照してください 14.19.2 try-catch-finallyの実行 of Java Language Specification

9
stacker

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();
    }
}
3

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";
      }
   }
}

私が得た出力は「最終的に」でした。

2
Prince Kumar

公式説明 によると:

注:tryまたはcatchコードの実行中にJVMが終了すると、finallyブロックが実行されない場合があります。同様に、tryまたはcatchコードを実行しているスレッドが中断または強制終了された場合、アプリケーション全体が継続していても、finallyブロックが実行されない場合があります。

ここに回答を投稿する前に、公式ウェブサイトを参照することをお勧めします。

0
karl li

Finallyブロックに戻りがある場合、try-catchブロックの戻りをオーバーライドします。この「機能」のため、finallyブロックは例外をスローしたりreturnステートメントを使用したりしないようにすることをお勧めします。

0
samuel owino

メソッドがキャッチされない例外または明示的なreturnステートメントを介して呼び出し元に戻ろうとすると、finally節もメソッドが戻る直前に実行されます。

0
Sudhakar