Warum wird Java nach einer nicht erfassten Ausnahme erfolgreich beendet?

24

Jedes Mal, wenn ein Perl-, Python-, C ++ - oder Tcl-Programm mit einer nicht behandelten Ausnahme angehalten wird, achten diese Sprachlaufzeiten darauf, einen Exit-Code ungleich Null für den Prozess zu registrieren. Sogar Eclipse-basierte Programme geben 1 zurück, wenn sie während des Startvorgangs fehlschlagen. Nach dem Standard ausgeführte Programme geben java.exejedoch problemlos Null zurück, egal wie plötzlich sie enden, es sei denn, das Programm ruft System.exit()mit einem Exit-Wert auf. Gerade AssertionFailedErroroder UnsatisfiedLinkErrorwerden als erfolgreiche Exits an das aufrufende Programm zurückgemeldet.

Natürlich haben nicht alle Systeme Programmrückgabecodes, aber Unix und Windows waren wichtig genug, java.lang.Process.exitValue()um untergeordnete Prozesse zu gewährleisten. Gewähren sie nicht auch die Einhaltung von Konventionen für übergeordnete Prozesse?

Ist das ein Fehler im Sprachdesign oder nur in der Implementierung? Gibt es ein Argument, dass es eine gute Idee ist?

James
quelle
Ich frage mich, ob dies für StackOverflow nicht besser geeignet ist. Nur eine Meinung.
Gablin
@gablin Mmm, in der Tat habe ich angefangen, diese Frage auf SO zu schreiben, dann habe ich es mir anders überlegt und sie hier gepostet.
James
4
Der javaBefehl in Java 6 und Java 7 scheint mit einem Exit-Code ungleich Null zu antworten, wenn eine nicht abgefangene Ausnahme ausgelöst wird.
dimo414

Antworten:

28

Wenn in der Java-Sprachspezifikation nicht explizit definiert ist, welcher Exit-Wert zu erwarten ist, ist sie undefiniert und Sie sollten sich nicht darauf verlassen.

Sie müssen Throwable in Ihrer Hauptmethode abfangen und System.exit (1) selbst aufrufen.


quelle
8
Ist es nicht ein Mangel, es undefiniert zu lassen?
James
3
Vielleicht, vielleicht nicht. Das einzig Wichtige ist, was die JLS sagt.