Perché Java esce con successo dopo un'eccezione non rilevata?


24

Ogni volta che un programma Perl, Python, C ++ o Tcl si interrompe con un'eccezione non gestita, questi runtime linguistici si occupano di registrare un codice di uscita diverso da zero per il processo. Anche i programmi basati su Eclipse restituiscono 1 se falliscono durante l'avvio. I programmi eseguiti dallo standard java.exe, tuttavia, restituiscono felicemente zero, non importa quanto bruscamente finiscano, a meno che il programma non chiami System.exit()con un valore di uscita. Anche AssertionFailedErroroUnsatisfiedLinkError vengono riportati al programma chiamante come uscite riuscite.

Naturalmente non tutti i sistemi hanno codici di ritorno del programma, ma Unix e Windows erano abbastanza importanti da giustificare java.lang.Process.exitValue() processi secondari; non garantiscono anche il rispetto delle convenzioni per i processi dei genitori?

È un difetto nella progettazione del linguaggio o solo nell'implementazione? C'è un argomento secondo cui è una buona idea?


Mi chiedo se questo non è più adatto su StackOverflow ... Solo un parere, però.
gablin,

@gablin Mmm, in effetti ho iniziato a scrivere questa domanda su SO, poi ho cambiato idea e l'ho pubblicato qui.
James,

4
Il javacomando in Java 6 e Java 7 sembrano entrambi rispondere con un codice di uscita diverso da zero se viene sollevata un'eccezione non rilevata.
dimo414,

Risposte:


28

Se la specifica del linguaggio Java non definisce esplicitamente quale valore di uscita aspettarsi, allora non è definito e si deve fare affidamento su di esso.

Devi prendere Throwable nel tuo metodo principale e chiamare System.exit (1) da solo.


8
Quindi non è un difetto lasciarlo indefinito?
James,

3
Forse sì forse no. L'unica cosa importante è ciò che dice JLS.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.