7

私は取り組んでいますMy application's under maintanace module

try {
    if (isUndermaintanace) {
        System.exit(1);
    } else {
        prepareResources();
    }           
} catch (Exception e) {
    printStack(e);
} finally {
    cleanResources();
}

私が isundermaintanace true 最終的に実行していないときに渡します。

私は何が欠けていますか?それを行う他の方法はありますか?

4

5 に答える 5

15

FinallyVMを強制終了した場合(またはVMが他の方法で終了した場合)は実行されません。System.exit() は、プログラムを強制終了するかなり大雑把な方法ですが、finally は高レベルの OOP の概念です。System.exit() は、可能な限りクリーンアップを行わず、非常に迅速にベイルします。

タスク マネージャーでプロセスを強制終了した場合、またはプロセスで akill -9を発行した場合、finally が実行されると思いますか? 漠然と(非常に漠然と)同じことです。


注目すべき点がいくつかあります。特に、投稿の最初の部分で少し嘘をつきました。System.exit()本当に即座にプログラムを強制終了することに例えるのは誤解を招きます。特に、シャットダウン フックが実行され、構成されている場合はファイナライザーを実際に実行できます。ただし、ドキュメントでは使用しないことをかなり強く示唆していることに注意してくださいrunFinalizersOnExit

于 2013-02-15T23:23:19.117 に答える
2

System.exit他のコード実行 (finallyブロックなど) をバイパスして、すぐにプログラムを終了します。finallyブロックの実行後にプログラムを終了する場合は、代わりに例外をスローします。

于 2013-02-15T23:23:51.943 に答える
2

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

于 2013-02-15T23:24:30.910 に答える
1

finally ブロックが実行されない唯一の例外的なケースは、 の前に 'System.exit(1)' を呼び出した場合です。これは、 JVM を終了させるfinally blockと予想される動作です。System.exit(1)

于 2013-02-15T23:23:30.507 に答える
1

を呼び出すとSystem.exit()、コードは実行されませんfinally。その呼び出しは JVM を終了するためです。

于 2013-02-15T23:25:15.357 に答える