¿Por qué sale Java con éxito después de una excepción no detectada?

24

Cada vez que un programa Perl, Python, C ++ o Tcl se detiene con una excepción no controlada, esos tiempos de ejecución del lenguaje se encargan de registrar un código de salida distinto de cero para el proceso. Incluso los programas basados ​​en Eclipse devuelven 1 si fallan durante el inicio. java.exeSin embargo, los programas ejecutados por el estándar devuelven felizmente cero sin importar cuán abruptamente terminen, a menos que el programa llame System.exit()con un valor de salida. Incluso AssertionFailedErroro UnsatisfiedLinkErrorse informa al programa de llamadas como salidas exitosas.

Por supuesto, no todos los sistemas tienen códigos de retorno de programas, pero Unix y Windows fueron lo suficientemente importantes como para garantizar java.lang.Process.exitValue()procesos secundarios; ¿No garantizan también honrar las convenciones para los procesos de los padres?

¿Es esto una falla en el diseño del lenguaje o solo en la implementación? ¿Hay un argumento de que es una buena idea?

James
fuente
Me pregunto si esto no es más adecuado en StackOverflow ... Sin embargo, solo una opinión.
gablin
@gablin Mmm, de hecho comencé a escribir esta pregunta en SO, luego cambié de opinión y la publiqué aquí.
James
44
El javacomando en Java 6 y Java 7 parecen responder con un código de salida distinto de cero si se genera una excepción no detectada.
dimo414

Respuestas:

28

Si la Especificación del lenguaje Java no define explícitamente qué valor de salida esperar, entonces no está definida y no debe confiar en ella.

Debe atrapar Throwable en su método principal y llamar a System.exit (1) usted mismo.


fuente
8
Entonces, ¿no es una deficiencia dejarlo sin definir?
James
3
Tal vez tal vez no. Lo único importante es lo que dice el JLS.