2
try {
    if (myBoolean) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    code.to.cleanup();
}

完全にはわかりませんが、myBooleanの値に関係なく、finally句が実行されない可能性があると思われる上記のコードスニペットを次に示します。

4

5 に答える 5

9

いいえ、System.exit(1)finally句が実行されないようにします。

基本的に、finallyブロックは、またはが正常に返されるか例外的に返されるかに関係なく、 try/の後に実行されます。catchtrycatch

ただし、 AはブロックがまったくSystem.exit戻らないようにします。

(ただし、Peterが指摘しているように、while(true) ;明らかに無期限にブロックされます。これwhile (true) ;は、より意味のある何かのスタブであると想定されています:)

于 2012-06-19T13:34:15.780 に答える
2

myBoolean値がtrueの場合、無限ループに入るからです。whileステートメントの後にセミコロンを置き忘れたと思います。

2番目のケースでは、 myBooleanがfalseの場合、System.exit(1)は、それ以上のステートメントを実行せずにプログラムを終了させます。

于 2012-06-19T13:35:42.237 に答える
0

あなたの例でfinallyは、ブロックが無限ループの場合はコードとして実行されず、それ以外の場合はJVMがシャットダウンします。ただし、他の通常のシナリオでは、tryブロックにreturnキーワードがある場合でも、最終的には常に実行されます。

try {
  System.out.println("Returning from here....");
  return;
} finally {
  System.out.println("Inside finally....");
}

出力は次のようになります。

ここから戻る…。
いよいよ中…。
于 2012-06-19T13:50:22.220 に答える
0

System.exit(1)は、finallyブロックを含め、呼び出しスタックにあるものをすべて無視して、アプリケーションの残忍な終了を実行します。
GCも実行されないため、アプリケーションで使用されるリソースが「ハング」または「ゾンビ」状態のままになる可能性があることに注意してください(閉じられていないファイルなど)
。理論上、私のコメントは無視してください。

于 2012-06-19T13:52:06.143 に答える
0

他の人がすでに詳細に完全に答えているので、注意してください:実行がブロックを離れる場合、ブロックが実行される前に他のコードが実行finallyされないことを本質的に保証します。ブロック実行されることを保証するものではありません。後者は不可能です。極端な場合は、停電またはハードウェア障害を考慮してください。tryfinallyfinally

finally実行がtry/finalブロックを離れた後の状態について、プログラムの残りの部分に保証を提供できるようにすることを目的としています。finallyプログラム外の世界に保証を提供することを意図したものではありません。「プログラムの残りの部分」が実行を継続しない場合、OSが配布したリソースの観点から、デッドプロセスの後にクリーンアップするのはOSの責任であり、プログラムと対話する他のシステムの責任です。プロセスの突然の失敗に対処する方法があります。

于 2012-06-20T07:26:01.940 に答える