Pourquoi Java quitte-t-il avec succès après une exception non interceptée?

24

Chaque fois qu'un programme Perl, Python, C ++ ou Tcl s'arrête avec une exception non gérée, ces exécutions de langage prennent soin d'enregistrer un code de sortie non nul pour le processus. Même les programmes basés sur Eclipse renvoient 1 s'ils échouent au démarrage. Les programmes exécutés par la norme java.exe, cependant, renvoient heureusement zéro, peu importe à quel point ils se terminent brusquement, sauf si le programme appelle System.exit()avec une valeur de sortie. Même AssertionFailedErrorou UnsatisfiedLinkErrorsont signalés au programme appelant comme des sorties réussies.

Bien sûr, tous les systèmes n'ont pas de codes de retour de programme, mais Unix et Windows étaient suffisamment importants pour garantir java.lang.Process.exitValue()les processus enfants; ne garantissent-ils pas également le respect des conventions pour les processus parents?

Est-ce une faille dans la conception du langage ou simplement dans la mise en œuvre? Y a-t-il un argument selon lequel c'est une bonne idée?

James
la source
Je me demande si ce n'est pas mieux adapté sur StackOverflow ... Juste une opinion, cependant.
gablin
@gablin Mmm, en effet j'ai commencé à écrire cette question sur SO puis j'ai changé d'avis et je l'ai postée ici.
James
4
La javacommande dans Java 6 et Java 7 semble répondre avec un code de sortie différent de zéro si une exception non interceptée est levée.
dimo414

Réponses:

28

Si la spécification du langage Java ne définit pas explicitement la valeur de sortie à attendre, elle n'est pas définie et vous ne devez pas vous y fier.

Vous devez intercepter Throwable dans votre méthode principale et appeler System.exit (1) vous-même.


la source
8
N'est-ce pas une lacune de ne pas le définir?
James
3
Peut-être peut-être pas. La seule chose importante est ce que dit le JLS.