3

与えられたJavaコードはブロックに行きませんfinally、私はこれらのブロックが何があっても実行されることになっていると思いました:

public static void main(String[] args) {
    try {
        System.out.println("Hello world");
        System.exit(0);
    } finally {
        System.out.println("Goodbye world");
    }
}
4

5 に答える 5

5
System.exit(0);

JVM をアンロードします。つまり、それ以上の Java 命令は処理されません。finally{}

于 2013-01-29T08:13:34.237 に答える
4

はい、それは正常です。ブロックは常に実行されます。finallyただし、JVM を終了するときに、コードの最後に到達する前に JVM が停止する場合は除きます。

于 2013-01-29T08:13:47.537 に答える
4

Java 6 System.exit()docsに記載されているように:

この呼び出しSystem.exit(n)は、次の呼び出しと事実上同等です。Runtime.getRuntime().exit(n)

そして、あなたが行って見ればRuntime.exit()(私の太字):

シャットダウン シーケンスを開始して、現在実行中の Java 仮想マシンを終了します。このメソッドが正常に戻ることはありません。

仮想マシンのシャットダウン シーケンスは、2 つのフェーズで構成されます。最初のフェーズでは、登録されているすべてのシャットダウン フック (存在する場合) が不特定の順序で開始され、終了するまで同時に実行できます。2 番目のフェーズでは、終了時のファイナライズが有効になっている場合、呼び出されていないすべてのファイナライザーが実行されます。これが完了すると、仮想マシンは停止します。

基本的に、この関数が返すことができる (したがって句の実行を許可する) のは、実行中のセキュリティ マネージャが指定されたコードでの終了を許可しないfinallyため、 a を上げることだけです。SecurityException

于 2013-01-29T08:20:07.197 に答える
2

このSystem.exitメソッドは、現在のスレッドと他のすべてのスレッドの実行を停止します。finally が存在しても、実行を継続するための特別な許可がスレッドに与えられるわけではありません。

以前の A は、これについて非常に詳細に説明しています。 Java の System.exit() は try/catch/finally ブロックでどのように動作しますか?

于 2013-01-29T08:14:09.723 に答える
0

BySystem.exit(0)あなたはJvmを終了しているので、これ以降の行は実行されません。そのため、finallyブロックが実行されていないことがわかります。

于 2013-01-29T08:22:27.213 に答える