キャッチされない例外の後、Javaが成功して終了するのはなぜですか?


24

Perl、Python、C ++、またはTclプログラムが未処理の例外で停止するたびに、これらの言語ランタイムはプロセスにゼロ以外の終了コードを登録するように注意します。Eclipseベースのプログラムでさえ、起動中に失敗すると1を返します。java.exeしかし、標準で実行されるプログラムは、プログラムがSystem.exit()終了値で呼び出されない限り、どんなに突然終了しても喜んでゼロを返します。でもAssertionFailedErrorまたはがUnsatisfiedLinkError成功して終了として呼び出し元のプログラムに戻って報告されています。

もちろん、すべてのシステムにプログラムのリターンコードがあるわけではありませんが、UnixとWindowsはjava.lang.Process.exitValue()、子プロセスを保証するのに十分なほど重要でした。親プロセスの規約を順守することも保証されませんか?

これは言語設計の欠陥ですか、それとも実装の欠陥ですか?それは良いアイデアだという議論はありますか?


これがStackOverflowに適しているとは思えません...
ギャブリン

@gablinうーん、確かに私はSOでこの質問を書き始めて、気が変わってここに投稿しました。
ジェームズ

4
Java 6およびJava 7javaコマンドはどちらも、キャッチされない例外が発生した場合、ゼロ以外の終了コードで応答するようです。
dimo414

回答:


28

Java言語仕様で、予期される終了値が明示的に定義されていない場合、未定義であり、それに依存しないでください。

メインメソッドでThrowableをキャッチし、System.exit(1)を自分で呼び出す必要があります。


8
それを未定義のままにしておくことの欠点ではないでしょうか?
ジェームズ

3
多分そうでないかもしれません。唯一重要なことは、JLSの言うことです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.