質問

さまざまな理由で電話をかける System.exit 書くときに眉をひそめられる Java アプリケーション, では、すべてが計画どおりに進んでいないことを呼び出しプロセスに通知するにはどうすればよいでしょうか?

編集: 1 は standin ゼロ以外の終了コードの場合。

役に立ちましたか?

解決

の用法 System.exit 「アプリケーション」が実際にはサブアプリケーションである場合、眉をひそめられます(例:より大きな Java アプリケーション (サーバー) のサーブレット、アプレット):この場合、 System.exit JVM を停止し、したがって他のすべてのサブアプリケーションも停止する可能性があります。この状況では、アプリケーション フレームワーク/サーバーによってキャッチされ処理される適切な例外をスローすることが最善の選択肢です。

Java アプリケーションが実際にスタンドアロン アプリケーションとして実行されることを意図している場合は、次を使用しても問題はありません。 System.exit. 。この場合、終了値を設定するのが、おそらく失敗または成功を親プロセスに伝える最も簡単な (そして最もよく使用される) 方法です。

他のヒント

私は「」に同意します例外をスローする" 群衆。理由の 1 つは、他のコードでコードを使用できるようにしたい場合に、System.exit を呼び出すとコードが使用しにくくなるということです。たとえば、クラスが Web アプリやメッセージを消費するある種のアプリから役立つことがわかった場合、それらのコンテナーに何らかの方法で障害に対処する機会を許可するとよいでしょう。コンテナーは、操作を再試行したり、問題をログに記録して無視したり、管理者に電子メールを送信したりすることを決定する場合があります。

これの例外は、あなたの場合です main() 方法;これにより例外がトラップされ、呼び出される可能性があります System.exit() 呼び出しプロセスまたはシェルスクリプトによって認識できる何らかの値が含まれます。

System.exit() はブロックされ、それを開始したスレッドがシャットダウン フックで使用されている場合はデッドロックが作成されます。

Web サーブレット環境でも危険または問題となる可能性があります。

一般に、例外をスローすることは、他の代替手段とみなされます。

当社のポリシーでは、System.exit(-1) を呼び出すことは問題ありません (むしろ望ましい) が、init() メソッド内でのみ呼び出す必要があります。プログラムの通常のフロー中にそれを呼び出す前に、必ずよく考えます。

例外をスローすることは、特定のエラーに関する情報をアプリ内外に送信する最良の方法です。

数字だけでは次のようなことがわかりません。

Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"

(またはそれに近いもの)

それは眉をひそめられる 普通 出る。「すべてが計画通りに進んでいない」場合は、System.exit で問題ありません。

アップデート:あなたの「1」にはどこかに文書化された意味があると仮定していることを付け加えておきます。

何か問題が発生した場合にすべきことは例外をスローすることだと思います。こうすることで、アプリケーションがスタンドアロン アプリケーションとして実行されていない場合でも、呼び出し元はそれに反応し、何が問題だったのかに関する情報を得ることができます。また、スタック トレースを見ると何が問題になったのかをよりよく理解できるため、デバッグの目的でも簡単になります。

注意すべき重要な点の 1 つは、例外がトップ レベルに達し、VM が終了する場合、VM は戻りコード 1 を返すため、この戻りコードを使用する外部アプリケーションは何か問題が発生したと認識することです。

System.exit() が意味があると思う唯一のケースは、アプリが Java 以外のアプリケーションによって呼び出されるため、アプリが機能したかどうかを確認するためにリターン コードを使用する必要があり、それらのアプリケーションにうまくいかないことごとに異なる反応をするチャンス。別のリターンコードが必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top