Dlaczego Java kończy się sukcesem po nieprzechwyconym wyjątku?

24

Za każdym razem, gdy program Perl, Python, C ++ lub Tcl zatrzymuje się z nieobsługiwanym wyjątkiem, środowiska wykonawcze języka starają się zarejestrować niezerowy kod wyjścia dla procesu. Nawet programy oparte na Eclipse zwracają 1, jeśli zawiodą podczas uruchamiania. Programy uruchamiane przez standard java.exeszczęśliwie zwracają zero, bez względu na to, jak gwałtownie się kończą, chyba że program System.exit()wywoła wartość wyjściową. Nawet AssertionFailedErrorlub UnsatisfiedLinkErrorsą zgłaszane do programu wywołującego jako pomyślne wyjścia.

Oczywiście nie wszystkie systemy mają kody powrotu programów, ale Unix i Windows były na tyle ważne, że gwarantowały java.lang.Process.exitValue()procesy potomne; czy nie gwarantują również przestrzegania konwencji dotyczących procesów macierzystych?

Czy to wada w projektowaniu języka, czy tylko we wdrażaniu? Czy istnieje argument, że to dobry pomysł?

James
źródło
Zastanawiam się, czy lepiej to nie pasuje do StackOverflow ... Ale tylko opinia.
gablin
@gablin Mmm, rzeczywiście zacząłem pisać to pytanie na SO, potem zmieniłem zdanie i zamieściłem je tutaj.
James
4
javaPolecenia w Java 6 i Java 7 oba wydają się odpowiadać z niezerowym kodem wyjścia jeśli nieprzechwycony jest wyjątek.
dimo414,

Odpowiedzi:

28

Jeśli specyfikacja języka Java nie określa wprost oczekiwanej wartości wyjściowej, jest ona niezdefiniowana i nie należy na niej polegać.

Musisz złapać Throwable w swojej głównej metodzie i sam wywołać System.exit (1).


źródło
8
Czy to nie niedociągnięcie, aby pozostawić to niezdefiniowane?
James
3
Może, może nie. Jedyną ważną rzeczą jest to, co mówi JLS.