System.exit()
kann verwendet werden, um Shutdown-Hooks auszuführen , bevor das Programm beendet wird. Dies ist eine bequeme Möglichkeit, das Herunterfahren in größeren Programmen zu handhaben, in denen sich alle Teile des Programms nicht bewusst sein können (und sollten). Wenn jemand beenden möchte, kann er einfach anrufen System.exit()
, und die Shutdown-Hooks (sofern ordnungsgemäß eingerichtet) sorgen für alle erforderlichen Shutdown-Zeremonien wie das Schließen von Dateien, das Freigeben von Ressourcen usw.
"Diese Methode kehrt nie normal zurück." bedeutet nur, dass die Methode nicht zurückkehrt; Sobald ein Thread dorthin geht, kommt er nicht mehr zurück.
Eine andere, vielleicht häufigere Möglichkeit, ein Programm zu beenden, besteht darin, einfach das Ende der main
Methode zu erreichen . Wenn jedoch Nicht-Daemon-Threads ausgeführt werden, werden diese nicht heruntergefahren und die JVM wird daher nicht beendet. Wenn Sie also solche Nicht-Daemon-Threads haben, benötigen Sie andere Mittel (als die Shutdown-Hooks), um alle Nicht-Daemon-Threads herunterzufahren und andere Ressourcen freizugeben. Wenn keine anderen Nicht-Daemon-Threads vorhanden sind, wird durch die Rückkehr von main
die JVM heruntergefahren und die Shutdown-Hooks aufgerufen.
Aus irgendeinem Grund scheinen Shutdown-Hooks ein unterbewerteter und missverstandener Mechanismus zu sein, und die Leute erfinden das Rad mit allen Arten von proprietären benutzerdefinierten Hacks neu, um ihre Programme zu beenden. Ich würde die Verwendung von Abschalthaken empfehlen. Es ist alles in der Standard- Laufzeit vorhanden , die Sie sowieso verwenden werden.
Runtime.getRuntime().halt()
)In diesem Fall wird es nicht benötigt. Es wurden keine zusätzlichen Threads gestartet, Sie ändern den Exit-Code nicht (standardmäßig 0) - im Grunde ist es sinnlos.
Wenn die Dokumente sagen, dass die Methode niemals normal zurückgegeben wird, bedeutet dies, dass die nachfolgende Codezeile praktisch nicht erreichbar ist, obwohl der Compiler das nicht weiß:
Entweder wird eine Ausnahme ausgelöst oder die VM wird vor der Rückkehr beendet. Es wird niemals "einfach zurückkehren".
Es ist sehr selten wert,
System.exit()
IME anzurufen. Es kann sinnvoll sein, wenn Sie ein Befehlszeilentool schreiben und einen Fehler über den Exit-Code anzeigen möchten, anstatt nur eine Ausnahme auszulösen. Ich kann mich jedoch nicht erinnern, wann ich ihn das letzte Mal im normalen Produktionscode verwendet habe .quelle
System.exit()
wird nie normal abgeschlossen - es wird immer entweder mit einer Ausnahme oder mit dem Herunterfahren der VM abgeschlossen (was im JLS nicht wirklich behandelt wird).Die Methode wird nie zurückgegeben, da dies das Ende der Welt ist und keiner Ihrer Codes als nächstes ausgeführt wird.
In Ihrem Beispiel wird Ihre Anwendung ohnehin an derselben Stelle im Code beendet, wenn Sie jedoch System.exit verwenden. Sie haben die Möglichkeit, einen benutzerdefinierten Code an die Umgebung zurückzugeben, z
Wer wird Ihren Exit-Code verwenden? Ein Skript, das die Anwendung aufruft. Funktioniert unter Windows, Unix und allen anderen skriptfähigen Umgebungen.
Warum einen Code zurückgeben? Um Dinge wie "Ich hatte keinen Erfolg" zu sagen, "Die Datenbank hat nicht geantwortet".
Um zu sehen, wie Sie den Wert eines Exit-Codes abrufen und in einem Unix-Shell-Skript oder einem Windows-Cmd-Skript verwenden können, überprüfen Sie diese Antwort möglicherweise auf dieser Site
quelle
System.exit(0)
beendet die JVM. In einfachen Beispielen wie diesem ist es schwierig, den Unterschied zu erkennen. Der Parameter wird an das Betriebssystem zurückgegeben und normalerweise verwendet, um auf eine abnormale Beendigung hinzuweisen (z. B. einen schwerwiegenden Fehler). Wenn Sie also Java aus einer Batchdatei oder einem Shell-Skript aufrufen, können Sie diesen Wert abrufen und sich ein Bild machen wenn die Bewerbung erfolgreich war.Es würde erhebliche Auswirkungen haben, wenn Sie eine
System.exit(0)
auf einem Anwendungsserver bereitgestellte Anwendung aufrufen würden (denken Sie darüber nach, bevor Sie es versuchen).quelle
In Anwendungen mit komplexen Shutdown-Hooks sollte diese Methode nicht von einem unbekannten Thread aufgerufen werden.
System.exit
Wird nie normal beendet, da der Anruf blockiert wird, bis die JVM beendet wird. Es ist, als ob der Code ausgeführt wird, an dem der Netzstecker gezogen ist, bevor er beendet werden kann. Durch das AufrufenSystem.exit
werden die Shutdown-Hooks des Programms ausgelöst, und der aufgerufene ThreadSystem.exit
wird bis zum Beenden des Programms blockiert. Dies hat zur Folge, dassSystem.exit
das Programm blockiert , wenn der Shutdown-Hook wiederum eine Aufgabe an den Thread sendet, von dem aus aufgerufen wurde.Ich behandle dies in meinem Code wie folgt:
quelle
Die Antwort war zwar sehr hilfreich, aber einige haben einige zusätzliche Details übersehen. Ich hoffe, dass das Folgende zusätzlich zur obigen Antwort zum Verständnis des Herunterfahrens in Java beiträgt:
PS: Die JVM kann ordnungsgemäß oder abrupt heruntergefahren werden.
quelle
Man sollte NIEMALS
System.exit(0)
aus folgenden Gründen anrufen :Das Beenden des Programms "normal" liefert dem Betriebssystem den gleichen Exit-Code,
System.exit(0)
so dass es redundant ist.Wenn Ihr Programm nicht "normal" beendet werden kann, haben Sie die Kontrolle über Ihre Entwicklung [Design] verloren. Sie sollten immer die volle Kontrolle über den Systemstatus haben.
Übrigens: Die Rückgabe anderer Rückkehrcodes als 0 ist sinnvoll, wenn Sie auf eine abnormale Programmbeendigung hinweisen möchten.
quelle
System.exit wird benötigt
In Ihrem Fall macht es genau das Gleiche wie die einfache Rückkehr von der Hauptleitung.
quelle
exit
als wäre dies Ihre einzige Option.exit
. Nicht die einzige Option, aber definitiv eine erwägenswerte Option.Java Language Specification sagt das
Es bedeutet, dass Sie es verwenden sollten, wenn Sie ein großes Programm haben (zumindest größer als dieses) und dessen Ausführung beenden möchten.
quelle
Wenn in der JVM ein anderes Programm ausgeführt wird und Sie System.exit verwenden, wird auch dieses zweite Programm geschlossen. Stellen Sie sich zum Beispiel vor, Sie führen einen Java-Job auf einem Clusterknoten aus und das Java-Programm, das den Clusterknoten verwaltet, wird in derselben JVM ausgeführt. Wenn der Job System.exit verwenden würde, würde er nicht nur den Job beenden, sondern auch "den gesamten Knoten herunterfahren". Sie können keinen weiteren Job an diesen Clusterknoten senden, da das Verwaltungsprogramm versehentlich geschlossen wurde.
Verwenden Sie daher System.exit nicht, wenn Sie Ihr Programm von einem anderen Java-Programm innerhalb derselben JVM aus steuern möchten.
Verwenden Sie System.exit, wenn Sie die gesamte JVM absichtlich schließen möchten und die in den anderen Antworten beschriebenen Möglichkeiten nutzen möchten (z. B. Hooks zum Herunterfahren : Java-Shutdown-Hook , Rückgabewert ungleich Null für die Befehlszeile Aufrufe: So erhalten Sie den Exit-Status eines Java-Programms in einer Windows-Batchdatei ).
Schauen Sie sich auch Runtime Exceptions: System.exit (num) an oder werfen Sie eine RuntimeException von main?
quelle