Чому 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.