エラーが発生したときに Java アプリケーションをシャットダウンする方法はありますか? たとえば、nullpointerexception がある場合、それを完全に閉じることはできますか?
3 に答える
最上位でキャッチされない例外があると、それが含まれているスレッドが自動的に停止します。プログラムに複数のスレッドがある場合でも、他のスレッドは存続します。明示的に終了したい場合は、呼び出すことができますSystem.exit()
を使用System.exit(0);
して JVM を終了できます。
ただし、NullPointerException
参照を使用する前にチェックして回避する必要があります。
if(foo != null) foo.doSomething();
他の人が言ったように、例外をキャッチして呼び出すことSystem.exit()
は(一般的に)正しいアプローチです。しかし、それだけではありません。
Q:本当に捕まえる必要がありますか?
A: アプリケーションが従来のコマンド ライン アプリケーションであり、「メイン」スレッドで例外がスローされる場合は、それをキャッチする必要はありません。メインスレッドでキャッチされない例外により、アプリケーションが終了します...他の非デーモンスレッドが存在しない場合。(実際、同じことがどのスレッドにも当てはまります...)
ただし、スレッドに非デーモン スレッドが複数ある場合は、アプリケーションを停止するために何かを行う必要があります。同様に、例外をキャッチして呼び出しますexit()
。
Q:どこで捕まえますか?
A: 「致命的な」例外がスローされる可能性のあるスレッドのスタック。これを行うには、次の 2 つの方法があります。
main(String[])
メソッド、スレッドのメソッドなどに try / catch (Throwable) を入れrun()
ます。デフォルトのキャッチされない例外ハンドラをインストールします。
やりたくないことはSystem.exit()
、コードベース全体に呼び出しを追加することです。そのアプローチは、再利用性、単体テスト、および一般的に「なぜエフィングアプリケーションが再び死んでしまったのか」を理解することに関するあらゆる種類の問題につながります。
Q: すでに捕まっている場合は?
A: アプリケーションが自然に終了しない理由の 1 つは、コードが既に例外をキャッチしていることです... 偶然です。例えば:
try {
doSomething()
} catch (Exception ex) {
handle an IO exception
}
上記で、無知で怠惰なプログラマーは、スローされる可能性のある例外を気にせずdoSomething
、それらはすべて何らかの IO 関連の例外であると想定しています。しかし、例外が実際に予期しないNullPointerException
ものだった場合、またはもっと悪いことだった場合は、コードがそれを押しつぶしただけです。
この種のことに対する治療法は、プログラマーの悪い習慣を治すためのコードレビューとメンタリングです...うまくいけば、彼がコードベースに大きなダメージを与える前に! そして、コードベースでこの種のものを見つけた場合は、すぐに修正する必要があります...そして、おそらく同様の発生を「grep」して修正します。