13

句が。を呼び出している間、 AはキャッチされずにブロックにRuntimeExceptionスローされます。tryfinallySystem.exit()

public static void main(String[] args) {
    try {
        Integer.valueOf("NotANumber");
    } finally {
        System.out.println("finally");
        System.exit(0);
    }
}

出力は

finally

System.exit(0)がfinallyから削除された場合、出力は次のようになります。

finally
Exception in thread "main" java.lang.NumberFormatException: For input string: "NotANumber"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:449)
    at java.lang.Integer.valueOf(Integer.java:554)
    at exception.MyExcepTest.main(MyExcepTest.java:20)

のメッセージの前、後、または間に「最終的に」が表示される場合がありNumberFormatExceptionます。

誰か説明できますか?

4

5 に答える 5

16

finallyブロックは、mainメソッドが終了する前に確実に実行され、その後、JVMによってスタックトレースが出力されます。

たぶん、スタックトレースがSystem.errに出力され、2つのストリームが予測できない方法でコンソール出力で混同されます(基本的に同時に生成されるため)。

System.errにも「finally」を出力するとどうなりますか?

于 2011-11-24T10:13:48.883 に答える
7

問題は、例外がスローされた場合です。JVMは、finallyブロック内でコードを実行し、キャッチされた場合は例外をスローします。そうしないと、例外がスローされ、スレッドが終了します。したがって、ここでSystem.exit(0)がfinallyブロックに存在する場合、JVMが例外をスローする機会がないように、スレッドをすぐに終了します。つまり、出力は「最終的に」にすぎません。

于 2011-11-24T10:20:11.340 に答える
3

最後に、ブロックは常に実行されます。それは言語によって保証されています。ブロックを正常に終了しようとした場合、または例外がスローされた場合に実行されます。

チェックされている例外とチェックされていない例外があります。チェックされていない例外(ランタイムとエラー)の場​​合、catchブロックを作成する必要はありません。ただし、すべての例外は、スタックトレースを出力するJVMによってキャッチされます。finallyブロックがアプリケーションを終了すると、スタックトレースを出力する機会がないため、表示されません。

通常、finallyブロックでプログラムを終了すると、コードが正常に実行されても終了するため、問題があります。そして、より一般的には、最終的にブロックは通常、ファイルやソケットなどを閉じるなどのクリーンアップに必要であり、より複雑なビジネスロジックには必要ありません。

于 2011-11-24T10:16:34.850 に答える
1

try で使用できる 2 つのブロックがあります。それらは catch と finally です。

catch ブロックは、RunTime 例外がスローされたときに (finally の前に) 実行され、finally ブロックは、例外がスローされたかどうかに関係なく、最後に実行されます。

したがって、例外がスローされたときに何かをしたい場合は、それを catch(Excepion e) ブロックに入れることができます。

そして、あなたが見ているのは、プログラムの実行を終了する前に、finally ブロックに書かれていることを実行するという JVM の義務です。

プログラムが終了すると、デフォルトでスローされた例外のトレースが表示されます。

于 2011-11-24T10:22:30.697 に答える