Почему Java успешно завершает работу после неперехваченного исключения?

Почему Java успешно завершает работу после неперехваченного исключения?
Почему Java успешно завершает работу после неперехваченного исключения? - moonboyz @ Unsplash

Каждый раз, когда программа на Perl, Python, C++ или Tcl останавливается с необработанным исключением, среды выполнения этих языков заботятся о регистрации ненулевого кода выхода для процесса. Даже программы на основе Eclipse возвращают 1, если они терпят неудачу во время запуска. Однако программы, работающие по стандарту java.exe, с радостью возвращают ноль независимо от того, насколько резко они заканчиваются, если только программа не вызывает System.exit() со значением выхода. Даже AssertionFailedError или UnsatisfiedLinkError сообщаются вызывающей программе как успешные выходы.

Конечно, не все системы имеют коды возврата программы, но Unix и Windows были достаточно важны, чтобы гарантировать java.lang.Process.exitValue() для дочерних процессов; разве они не гарантируют соблюдение соглашений для родительских процессов?

Является ли это недостатком в дизайне языка или только в реализации? Есть аргумент, что это хорошая идея?

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

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


LetsCodeIt, 26 мая 2023 г., 09:50