Differenza nel sistema. exit (0), System.exit (-1), System.exit (1) in Java


280

Mi piacerebbe sapere la differenza tra i seguenti in Java

System.exit(0);
System.exit(-1);
System.exit(1);

Quando devo usare il codice sopra in modo appropriato?


17
perché non hai contrassegnato la risposta come "migliore risposta", quindi c'è un segno di spunta verde? aiuta gli altri a sapere qual è il migliore !!
Saksham Goyal,

Risposte:


253

Il parametro di uscita deve essere qualificato se l'esecuzione del programma è andata a buon fine. È una sorta di eredità dai vecchi linguaggi di programmazione in cui è utile sapere se qualcosa è andato storto e cosa è andato storto.

Il codice di uscita è

  • 0 quando l'esecuzione è andata bene;
  • 1, -1, whatever != 0Quando si è verificato un errore, è possibile utilizzare valori diversi per diversi tipi di errori.

Se sono corretto i codici di uscita erano solo numeri positivi (intendo in UNIX) e in base all'intervallo:

  • 1-127sono codici definiti dall'utente (così generati chiamando exit(n))
  • 128-255sono codici generati dalla terminazione a causa di diversi segnali unix come SIGSEGV o SIGTERM

Ma non penso che ti debba interessare durante la programmazione su Java, sono solo un po 'di informazioni. È utile se prevedi di far interagire i tuoi programmi con strumenti standard.


31
Si noti inoltre che un codice di uscita pari a 0 viene considerato vero nella shell e qualsiasi altro codice viene considerato falso. Quindi java MyApp && echo successstamperà "successo" se MyApp ha un codice di uscita pari a 0, ovvero se chiama exit(0)o raggiunge semplicemente la fine del metodo principale senza errori.
sepp2k,

16
Per favore, fai sempre attenzione al codice di uscita se la tua app può essere utilizzata in uno script. È molto fastidioso avere uno strumento che non funziona in modo silenzioso nel mezzo dello script (o stampare una traccia dello stack ed uscire con 0).
Doncho Gunchev,

6
Una cosa da notare: quando si restituisce -1, il numero positivo più grande possibile viene restituito in un contesto senza segno (nella rappresentazione del complemento a due -1 imposta sempre tutti i bit indipendentemente dal numero di byte nel numero). Quindi -1 viene generalmente restituito quando si restituisce un errore non specifico e non si desidera che si scontri con possibili codici di errore che sono già definiti e documentati. ad es. il codice di errore 1 potrebbe essere stato documentato come errore di scrittura; codice di errore 2 potrebbe essere errore di lettura, ecc.
Nylon Smile

In realtà è una sorta di "eredità" dall'uscita * (2) di Unix.
Marchese di Lorne,

127

Zero => Tutto ok

Positive => Qualcosa che mi aspettavo potrebbe potenzialmente andare storto è andato storto (riga di comando errata, impossibile trovare il file, impossibile connettersi al server)

Negative=> Qualcosa che non mi aspettavo affatto è andato storto (errore di sistema - eccezione imprevista - terminazione forzata esternamente, ad es. kill -9)

(i valori maggiori di 128 sono in realtà negativi, se li consideri come binari con segno a 8 bit o complemento a due)

C'è un sacco di buoni codici di uscita standard qui


12
"Qualcosa che mi aspettavo di andare storto è andato storto" suona come "Tutto ok".
Tobe

"Le cose che io come sviluppatore possiamo ragionevolmente prevedere anticipare" Errore utente vs Errore di sistema; Questo è in realtà coperto dal poster in alto: i valori 128-255 sono binari con segno a 8 bit.
Robert

6
@tobe È davvero più simile a "Qualcosa che mi aspettavo potesse andare storto è andato storto";)
Marcel Hernandez,

1
Bash considera i codici di uscita come non firmati a 8 bit e mod 256, quindi un -1 diventa 255 e 256 diventa 0. I segnali (in un'uccisione, ad esempio kill -15) spesso generano un codice di uscita 128+signal, ma (a parte 9) possono essere gestiti e restituisce un codice di uscita diverso. La -in kill -15è segna il numero come un segnale e non un pid, esso non rendono il negativo del segnale.
Matteo

Quando lo fai System.exit(-1)e poi nella tua shell echo $?ottieni '255'. Questo è il motivo per cui ho detto che i numeri negativi sono errori di sistema, non a causa del '-' nel parametro kill. Pensavi seriamente che è quello che pensavo? Ma grazie per aver spiegato il meccanismo con cui Bash costruisce questi codici.
Robert

51

System.exit(system call)termina la macchina virtuale Java attualmente in esecuzione avviando la sua sequenza di spegnimento. L'argomento funge da codice di stato .

Per convenzione, un codice di stato diverso da zero indica una chiusura anomala.

  System.exit(0) or EXIT_SUCCESS;  ---> Success
  System.exit(1) or EXIT_FAILURE;  ---> Exception
  System.exit(-1) or EXIT_ERROR;   ---> Error

Maggiori informazioni su Java

Su sistemi Unix e Linux, 0per esecuzioni riuscite 1o superiore per esecuzioni fallite.


3
Questa risposta sembra in contraddizione con la risposta di @ robert
amdev,

Nel documento java non è stato menzionato che il codice di uscita -1 rappresenti ERRORE invece la dicitura è "stato - stato di terminazione. Per convenzione, un codice di stato diverso da zero indica una terminazione anomala".
Damith,

EXIT_*non esiste in Java.
juanchito


6

exit(0)generalmente utilizzato per indicare la risoluzione corretta. exit(1)oo exit(-1)qualsiasi altro valore diverso da zero indica la chiusura non riuscita in generale.


Quale è il motivo per cui l'argomento viene passato dal programmatore. Non è un valore restituito dal metodo. Come può indicare il risultato della terminazione?
anKotliner,

4

Ecco la risposta

System.exit(0);// normal termination - Successful - zero
System.exit(-1);//Exit with some Error
System.exit(1);//one or any positive integer // exit with some Information message

2

Un buon risultato è che qualsiasi codice di errore> 255 verrà convertito nel codice di errore% 256. Si dovrebbe prestare particolare attenzione a questo se utilizzano un codice di errore personalizzato> 255 e si aspettano l'esatto codice di errore nella logica dell'applicazione. http://www.tldp.org/LDP/abs/html/exitcodes.html


1

la differenza dei numeri inseriti in system.exit () è spiegata in altre risposte. ma la DIFFERENZA REALE è che System.exit () è un codice che viene restituito al processo di invocazione. Se il programma viene invocato dal sistema operativo, il codice di ritorno dirà al sistema operativo che se system.exit () restituiva 0 di tutto ciò che era ok, ma se non qualcosa è andato storto, allora potrebbero esserci dei gestori nel processo principale


0

Come altri rispondono 0significando successo, altrimenti.

Se si utilizza il file bat (finestra) System.exit(x)avrà effetto.

Codice java (myapp):

if (error < 2){
    help();
    System.exit(-1);    
}
else{
    doSomthing();
    System.exit(0);
}

}

file bat:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --

-2

System.exit (0) per convenzione, un codice di stato diverso da zero indica una chiusura anomala.

System.exit (1) -Significa terminazione non riuscita a causa di un errore


L'argomento "funge sempre da codice di stato". Non solo quando è zero.
Marchese di Lorne

Oh si . scusate il mio cattivo EJP
androminor

-7
class calc{
public static void main(String args[])
{
    int a, b, c;
    char ch;
    do{

        Scanner s=new Scanner(System.in);

                System.out.print("1. Addition\n");
                System.out.print("2. Substraction\n");
                System.out.print("3. Multiplication\n");
                System.out.print("4. Division\n");
                System.out.print("5. Exit\n\n");

                System.out.print("Enter your choice : ");
                ch=s.next().charAt(0);
                    switch (ch)
                    {
                        case '1' :
                        Addition chose1=new Addition();
                        chose1.add();
                        break;

                        case '2' :
                        Substraction chose2=new Substraction();
                        chose2.sub();
                        break;

                        case '3' :
                        Multiplication chose3= new Multiplication();
                        chose3.multi();
                        break;

                        case '4' :
                        Division chose4=new Division();
                        chose4.divi();
                        break;

                        case '5' :
                        System.exit(0);
                        break;

                        default :
                        System.out.print("wrong choice!!!");
                        break;
                    }
        System.out.print("\n--------------------------\n");                     
    }while(ch !=5); 
}

}

Nel codice sopra quando system.exit (0); e quando premo il caso 5 esce correttamente ma quando uso System.exit (1); e premo il caso 5 esce con errore e di nuovo quando provo con il caso 15 esce correttamente da questo, ho saputo che, quando mettiamo qualsiasi argomento interno, lo specifica, prende il personaggio da quella posizione, cioè se metto (4) che significa prendere il 5 ° carattere da quella stringa se è (3), allora significa prendere il 4 ° carattere da quella stringa inserita

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.