Unterschied im System. exit (0), System.exit (-1), System.exit (1) in Java


280

Ich möchte den Unterschied zwischen den folgenden in Java kennen

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

Wann muss ich den obigen Code entsprechend verwenden?


17
Warum haben Sie die Antwort nicht als "beste Antwort" markiert, sodass ein grünes Häkchen angezeigt wird? es hilft anderen Leuten zu wissen, was das Beste ist !!
Saksham Goyal

Antworten:


252

Der Parameter exit sollte sich qualifizieren, wenn die Ausführung des Programms gut oder schlecht verlaufen ist. Es ist eine Art Vererbung älterer Programmiersprachen, bei denen es nützlich ist zu wissen, ob etwas schief gelaufen ist und was schief gelaufen ist.

Exit-Code ist

  • 0 als die Hinrichtung gut ging;
  • 1, -1, whatever != 0Wenn ein Fehler aufgetreten ist , können Sie verschiedene Werte für verschiedene Arten von Fehlern verwenden.

Wenn ich richtig bin, waren die Exit-Codes früher nur positive Zahlen (ich meine unter UNIX) und nach Bereich:

  • 1-127sind benutzerdefinierte Codes (also durch Aufrufen generiert exit(n))
  • 128-255sind Codes, die durch Terminierung aufgrund unterschiedlicher Unix-Signale wie SIGSEGV oder SIGTERM generiert werden

Aber ich denke nicht, dass Sie sich beim Codieren auf Java darum kümmern sollten, es sind nur ein paar Informationen. Dies ist nützlich, wenn Sie Ihre Programme mit Standardwerkzeugen interagieren lassen möchten.


31
Beachten Sie auch, dass ein Exit-Code von 0 in der Shell als wahr und jeder andere Code als falsch gilt. So java MyApp && echo successdruckt „Erfolg“ iff MeineAnw einen Exit - Code von 0, das heißt , wenn es nennt exit(0)oder einfach erreicht das Ende des Hauptverfahrens ohne einen Fehler.
sepp2k

16
Bitte achten Sie immer auf den Exit-Code, wenn Ihre App in einem Skript verwendet werden kann. Es ist sehr ärgerlich, wenn ein Tool in der Mitte Ihres Skripts stillschweigend ausfällt (oder wenn Sie eine Stapelverfolgung drucken und mit 0 beenden).
Doncho Gunchev

6
Eines ist zu beachten: Bei der Rückgabe von -1 wird die größtmögliche positive Zahl im vorzeichenlosen Kontext zurückgegeben (in der Zweierkomplementdarstellung -1 werden immer alle Bits gesetzt, unabhängig von der Anzahl der Bytes in der Zahl). Daher wird -1 normalerweise zurückgegeben, wenn Sie einen unspezifischen Fehler zurückgeben und nicht möchten, dass er mit möglichen Fehlercodes kollidiert, die bereits definiert und dokumentiert sind. zB Fehlercode 1 könnte als Schreibfehler dokumentiert worden sein; Fehlercode 2 könnte ein Lesefehler usw. sein.
Nylon Smile

Es ist eigentlich eine Art Vererbung von Unix '* exit (2).
Marquis von Lorne

127

Zero => Alles in Ordnung

Positive => Etwas, von dem ich erwartet hatte, dass es möglicherweise schief gehen könnte, ging schief (schlechte Befehlszeile, Datei kann nicht gefunden werden, Verbindung zum Server konnte nicht hergestellt werden)

Negative=> Etwas , das ich gar nicht erwarten , ging schief (Systemfehler - unerwartete Ausnahme - von außen erzwungene Beendigung zB kill -9)

(Werte größer als 128 sind tatsächlich negativ, wenn Sie sie als 8-Bit-Binärzeichen mit Vorzeichen oder als Zweierkomplement betrachten.)

Hier gibt es eine Menge guter Standard-Exit-Codes


12
"Etwas, von dem ich erwartet hatte, dass es schief geht, ging schief" klingt wie "Alles in Ordnung".
tobt

"Dinge, von denen ich als Entwickler vernünftigerweise erwarten kann, dass sie" Benutzerfehler vs. Systemfehler; Dies wird tatsächlich durch das obere Poster abgedeckt: Die Werte 128-255 sind -ve für 8-Bit-Binärdateien mit Vorzeichen.
Robert

6
@tobe Es ist wirklich mehr wie „Etwas , was ich erwartet , könnte schief gehen ging tatsächlich falsch“;)
Marcel Hernandez

1
Bash behandelt Exit-Codes als 8-Bit ohne Vorzeichen und modifiziert 256, sodass -1 zu 255 und 256 zu 0 wird. Signale (z. B. bei einem Kill kill -15) führen häufig zu Exit-Code 128+signal, können aber (abgesehen von 9) behandelt werden und Geben Sie einen anderen Exit-Code zurück. Das -in kill -15is markiert die Zahl als Signal und nicht als pid, es macht das Signal nicht negativ.
Matthew

Wenn Sie dies tun System.exit(-1)und dann in Ihrer Shell, erhalten echo $?Sie '255'. Aus diesem Grund habe ich gesagt, dass negative Zahlen Systemfehler sind, nicht wegen des '-' im Kill-Parameter. Hast du ernsthaft gedacht, dass ich das dachte? Aber danke, dass Sie den Mechanismus erklärt haben, mit dem Bash diese Codes erstellt.
Robert

51

System.exit(system call)Beendet die aktuell ausgeführte virtuelle Java-Maschine durch Initiieren ihrer Herunterfahrsequenz. Das Argument dient als Statuscode .

Konventionell zeigt ein Statuscode ungleich Null eine abnormale Beendigung an.

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

Lesen Sie mehr bei Java

Auf Unix- und Linux-Systemen 0für erfolgreiche Ausführungen und 1höher für fehlgeschlagene Ausführungen.


3
Diese Antwort scheint im Widerspruch zu @
roberts

Im Java-Dokument wurde nicht erwähnt, dass der Exit-Code -1 ERROR darstellt. Stattdessen lautet der Wortlaut "Status - Beendigungsstatus. Konventionell weist ein Statuscode ungleich Null auf eine abnormale Beendigung hin."
Damith

EXIT_*existiert nicht in Java.
Juanchito


6

exit(0)Wird im Allgemeinen verwendet, um eine erfolgreiche Beendigung anzuzeigen. exit(1)oder exit(-1)oder ein anderer Wert ungleich Null zeigt im Allgemeinen eine erfolglose Beendigung an.


Was kann ich sagen, wenn das Argument vom Codierer übergeben wird? Kein Rückgabewert von der Methode. Wie kann es das Beendigungsergebnis anzeigen?
anKotliner

4

Hier ist die Antwort.

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

Ein gutes Problem ist, dass jeder Fehlercode> 255 in den Fehlercode% 256 konvertiert wird. Dies sollte besonders vorsichtig sein, wenn ein benutzerdefinierter Fehlercode> 255 verwendet wird und der genaue Fehlercode in der Anwendungslogik erwartet wird. http://www.tldp.org/LDP/abs/html/exitcodes.html


1

Der Unterschied der in system.exit () eingegebenen Zahlen wird in anderen Antworten erläutert. Der WIRKLICHE UNTERSCHIED ist jedoch, dass System.exit () ein Code ist, der an den aufrufenden Prozess zurückgegeben wird. Wenn das Programm vom Betriebssystem aufgerufen wird, teilt der Rückkehrcode dem Betriebssystem mit, dass, wenn system.exit () 0 zurückgibt, alles in Ordnung ist, aber wenn nichts schief gelaufen ist, möglicherweise einige Handler dafür im übergeordneten Prozess vorhanden sind


0

Wie andere antworten, 0bedeutet Erfolg, sonst.

Wenn Sie Bat-Datei (Fenster) verwenden System.exit(x), wirkt sich dies aus.

Code Java (myapp):

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

}}

Fledermausdatei:

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

-2

System.exit (0) Konventionell zeigt ein Statuscode ungleich Null eine abnormale Beendigung an.

System.exit (1) - Dies bedeutet, dass die Beendigung aufgrund eines Fehlers nicht erfolgreich war


Das Argument "dient immer als Statuscode". Nicht nur wenn es Null ist.
Marquis von Lorne

Oh ja . Entschuldigung, mein schlechtes EJP
androminor

-6
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); 
}

}}

Im obigen Code, wenn sein System.exit (0); und wenn ich Fall 5 drücke, wird es richtig beendet, aber wenn ich System.exit (1) benutze; und drücke Fall 5, es wird mit einem Fehler beendet und wieder, wenn ich es mit Fall 15 versuche, wird es richtig beendet, dadurch habe ich erfahren, dass, wann immer wir ein int-Innenargument setzen, es angibt, dass es das Zeichen von dieser Position nimmt, dh wenn ich es setze (4) dass es bedeutet, das fünfte Zeichen von dieser Zeichenfolge zu nehmen, wenn es (3) ist, dann bedeutet es, dass das vierte Zeichen von dieser eingegebenen Zeichenfolge genommen wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.