5

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

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

私が通り過ぎるときisundermaintanace trueついに実行されませんでした。

何が足りないの?他に方法はありますか?


  • おそらくあなたができる唯一のことは変更ですSystem.exit(1)他の方法でアプリをシャットダウンする。 - Louis Wasserman

5 답변


15

FinallyVMを殺した場合(またはVMが他の方法で死んだ場合)は実行されません。 System.exit()はプログラムを強制終了するためのかなり粗雑な方法ですが、最後には高レベルのOOPの概念です。 System.exit()は非常に迅速に保釈され、できるだけ少ないクリーンアップを行います。

あなたがタスクマネージャに入り、プロセスを殺したか、またはkill -9プロセス上であなたは最終的に実行することを期待しますか?漠然とです(非常に漠然と)同じこと。


注目に値することがいくつかあります。特に、私は記事の最初の部分で少しうそをついた。理解するのは誤解を招くSystem.exit()本当に即座にプログラムを殺すこと。特に、シャットダウンフックが実行され、そして設定されている場合ファイナライザは実際に実行することができます。ただし、これらのドキュメントでは、使用しないことを強く強く推奨しています。runFinalizersOnExit


  • 最初の文だけで+1。それを置くためのなんて優雅な方法です。 - corsiKa
  • しかし、どうですかis there any other way to do that ??? - user000001
  • @ user000001それに対処するために私の答えを編集するだけです。 System.exit()の後にファイナライザを実行する必要があることは、デザインが壊れているというかなり深刻な兆候です。 - Corbin
  • @Corbin + 1ファイナライザについて知りませんでした。 - user000001

2

System.exit他のコードの実行を回避して、プログラムを直ちに終了します。finallyブロック)。あなたが後にプログラムを終了したい場合finallyブロックが実行され、代わりに例外がスローされます。


2

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


1

唯一の例外的なケース最後にblockが実行されないのは、あなたが 'System.exit(1)'を呼び出す前です。finally blockこれは期待される振る舞いです。System.exit(1)JVMを終了します。


1

電話した場合System.exit()あなたのコードは実行されませんfinallyその呼び出しはJVMを終了させるからです。

リンクされた質問


関連する質問

最近の質問