Por que o Java sai com sucesso após uma exceção não capturada?

24

Sempre que um programa Perl, Python, C ++ ou Tcl for interrompido com uma exceção não tratada, esses tempos de execução de linguagem cuidarão para registrar um código de saída diferente de zero para o processo. Até os programas baseados em Eclipse retornam 1 se falharem durante a inicialização. Os programas executados pelo padrão java.exe, no entanto, retornam felizmente zero, não importa quão abruptamente eles terminem, a menos que o programa chame System.exit()com um valor de saída. Mesmo AssertionFailedErrorou UnsatisfiedLinkErrorsão relatados de volta ao programa de chamada como saídas bem-sucedidas.

Obviamente, nem todos os sistemas possuem códigos de retorno de programa, mas o Unix e o Windows eram importantes o suficiente para garantir java.lang.Process.exitValue()processos filhos; eles também não garantem convenções de honra para processos-pai?

Isso é uma falha no design da linguagem ou apenas na implementação? Existe um argumento de que é uma boa ideia?

James
fonte
Gostaria de saber se isso não é mais adequado no StackOverflow ... Apenas uma opinião, no entanto.
gablin
@ gablin Mmm, na verdade comecei a escrever esta pergunta no SO, depois mudei de idéia e publiquei aqui.
James
4
O javacomando no Java 6 e Java 7 parece responder com um código de saída diferente de zero se uma exceção não capturada for gerada.
precisa saber é o seguinte

Respostas:

28

Se o Java Language Specification não definir explicitamente qual valor de saída esperar, ele será indefinido e você não deve confiar nele.

Você precisa pegar Throwable no seu método principal e chamar System.exit (1).


fonte
8
Portanto, não é um defeito deixá-lo indefinido?
James
3
Talvez talvez não. A única coisa importante é o que o JLS diz.