2010-01-15 21 views
11

Rispetto a C/C++ main() deve sempre restituire un numero intero (zero per indicare il successo e non zero per indicare un errore). Posso capire che mentre il programma viene eseguito diventa un processo e ogni processo dovrebbe avere uno stato di uscita, che otteniamo facendo echo $? dalla shell dopo che il processo è finito.non restituisce nulla. Perché?

Ora non capisco perché il metodo principale non restituisce nulla in Java? Ha qualcosa a che fare con il fatto che il programma viene eseguito su JVM e il processo JVM è ripristinabile per il ritorno dello stato di uscita?

Si prega di chiarire.

Grazie,
Roger

risposta

14

Se il metodo principale di una singola applicazione java thread termina, l'applicazione terminerà con codice di uscita 0. Se avete bisogno di un altro codice di uscita, forse per indicare un errore, è possibile inserire

System.exit(yourNumberHere); 

ovunque nel codice (specialmente al di fuori del metodo principale).

Questo è diverso per le applicazioni multi-thread , dove è necessario utilizzare System.exit dall'interno di kill -9 dall'esterno per arrestare la JVM.

Ecco un breve esempio in cui cessazione principale non si ferma l'applicazione (un tipico servizio o comportamento daemon):

public static void main(String args[]) { 
    Thread iWillSurvive = new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
     // heat the CPU 
     } 
    } 
    }); 
    iWillSurvive.start(); 
} 

Nota: Certo, un thread terminerà quando è il metodo eseguito (o la metodo principale in caso di thread principale) termina. E in questo caso, quando tutti i thread sono terminati, la JVM terminerà con il codice di uscita 0 (che ci riporta alla domanda iniziale). Spero che tutti siano felici ora.

+0

Intendi dire se non ho un System.exit() nel mio programma, JVM lo aggiungerà con 0. E se il mio programma ha una chiamata esplicita con valore diverso da zero, verrà usato come uscita stato? – gameover

+0

Il processo Java non termina necessariamente se il metodo principale termina, rendendolo irragionevole (come fa notare kai1968) per restituire il codice di uscita del processo dal metodo principale. – jarnbjo

+0

Ancora sbagliato. Non è necessario utilizzare strumenti come kill o System.exit per interrompere l'applicazione Java multithread. Suggerimento: anche la più semplice applicazione Java "Hello world" è mutlithreaded (la Java VM inizia i propri thread per problemi di gestione diversi) e termina quando viene eseguito il metodo principale. – jarnbjo

7

Java ha System.exit(int) a tale scopo.

Fondamentalmente, un programma Java uscirà con il codice di uscita 0, se il flusso del programma raggiunge la fine del metodo principale (all'incirca, diventa più strano con Swing e threading, ma questo dovrebbe essere sufficiente).

Se si configura una chiamata a System.exit() da qualche parte (ovunque, in realtà) o Runtime.getRuntime().exit() che è ciò che chiamate System.exit(), quindi il programma termina immediatamente e prematuramente.

Si potrebbe immaginare come Java implicitamente aggiungere System.exit(0) alla fine del metodo principale, ma potrebbero esserci differenze più sottili. Comunque, non ho i dettagli completi dell'arresto della JVM nella mia testa.

+0

Non lo scriviamo alla fine di ogni programma Java, vero? – gameover

+0

Se non si desidera tornare in modo anomalo, no. Il codice di uscita implicito è '0', come al solito. – Joey

+0

Intendi dire se non ho un System.exit() nel mio programma, JVM lo aggiungerà con 0. E se il mio programma ha una chiamata esplicita con valore diverso da zero, verrà usato come uscita stato? – codaddict

0

Forse potrebbe essere perché System.exit(int exitCode) non ha restituito un valore.

+0

Non ho visto il post esistente come risposta, quindi ho modificato il post per renderlo più una risposta che una domanda. –

16

Progettato quando il multi-threading era già una cosa comune, java ha detto (in base alla progettazione) "addio" all'idea che quando "principale" restituisce il programma è fatto. Ecco perché non c'è valore di ritorno. Come gli altri hanno detto usare System.exit quando si vuole uscire con il codice di ritorno.

+0

Questo è praticamente tutto sommato. – McDowell

+0

+1 ottima spiegazione :) – atv

4

Un inconveniente minore - in C++, non c'è bisogno di tornare qualsiasi cosa, da principale:

int main() { 
} 

è un programma perfettamente legale C++ - agisce come se si avesse:

return 0; 

come l'ultima affermazione in main.

+0

Sono venuto qui per dirlo. Mi sorprende sempre che lo standard non richieda la restituzione del nulla in questo caso, e in effetti non ti è consentito dichiararlo in questo modo. Ma è così che funziona – jcoder

0

Sospetto che il motivo per cui C/C++ restituisce int sia perché è la convenzione per indicare la funzione/metodo/programma successo/errore in quelle lingue.

Con l'introduzione di Eccezioni in Java, anziché zero per il successo e valori diversi da zero per errore, utilizza una gerarchia di eccezioni per errori e i successi erano semplicemente quando non venivano lanciate eccezioni, eliminando così la necessità di restituire un valore.

+0

Tranne che lanciare un'eccezione da 'main()' non sarà utile, e l'unico output deve essere un codice di ritorno. Il fatto che C non supporti le eccezioni in un programma C e Java faccia in un programma Java non influisce sul modo in cui queste interagiscono con il sistema operativo. –

0

La maggior parte dei programmi che scrivo in questi giorni hanno una qualche forma di interfaccia utente e poco che potrebbero tornare utili, e anche meno probabile che ogni cosa abbia bisogno di quel codice di stato.

Quindi perché forzare tutti i programmi a restituirne uno? Come altri hanno già detto, è possibile restituire un codice di stato se si desidera ...

+0

Cosa sta forzando i programmi a restituire un codice di stato? –

1

il valore di uscita è utile per lo scripting come bash script o operazioni da riga di comando. Quindi in questi casi usa System.exit().

Problemi correlati