Почему 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Команда в Java 6 и Java 7 и , кажется, реагируют с кодом ненулевым , если перехватывается исключение.
dimo414

Ответы:

28

Если Спецификация языка Java не определяет явно, какое выходное значение ожидать, тогда оно не определено, и вы не должны полагаться на него.

Вам нужно перехватить Throwable в вашем основном методе и вызвать System.exit (1) самостоятельно.


источник
8
Так не является ли недостатком оставить это неопределенным?
Джеймс
3
Может быть, а может и нет. Единственная важная вещь - то, что говорит JLS.