5 Stimmen

Wie viele Möglichkeiten gibt es, ein Java-Programm zu beenden?

Ich weiß, dass die Verwendung von System.exit(0) ein Java-Programm beenden kann, zum Beispiel, wenn ich ein JFrame-Fenster habe, wird es geschlossen und beendet das Programm, aber ich frage mich, wie viele andere Möglichkeiten, kann es geschlossen werden und das Programm beendet werden? Auch wenn ein Fehler auftritt, wird das Programm beendet und der JFrame geschlossen?

4voto

Merlyn Morgan-Graham Punkte 56447

Um andere Antworten zu ergänzen:

  • Wenn der Prozess, der die VM hostet, gewaltsam beendet wird, verschwindet Ihr Programm spontan
  • Dasselbe passiert, wenn der Stecker auf dem Rechner gezogen wird, auf dem die VM läuft :)

1 Stimmen

Ich mache nicht nur Witze :) Dies ist tatsächlich ein wichtiges Szenario für einen Server, der ohne Datenverlust ausfallen muss.

1 Stimmen

+1 Das ist eines der schlimmsten Szenarien. Wäre das nicht der Fall, könnte die meiste Hochverfügbarkeitssoftware viel schneller.

3voto

Tim Jansen Punkte 3230

Ein Java-Programm endet, wenn der letzte Thread ohne Daemon-Flag endet, oder wenn Sie eine Methode aufrufen, die die virtuelle Maschine herunterfährt (System.exit(), Runtime.exit(), Runtime.halt() und möglicherweise noch einige mehr).

Alles andere bleibt den Bibliotheken überlassen, die System.exit() aufrufen (z. B. ein JFrame mit EXIT_ON_CLOSE).

1 Stimmen

Das ist zwar pingelig, aber was ist, wenn Sie einen Shutdown-Hook registriert haben, der in eine Endlosschleife gerät, wenn er ausgeführt wird?

2voto

bkritzer Punkte 1418

Das ist alles, was mir auf Anhieb einfällt:

  1. main() gibt zurück (entweder einen Wert oder ein void() main beendet die Ausführung der letzten Anweisung)

  2. Programm löst eine Ausnahme aus, die nicht abgefangen wird

  3. System.exit(int)

  4. Es kann abstürzen?

In Ihrem Fall eines JFrame schließen, ich glaube, es wäre ein onClose() Handler, die entweder ruft System.exit(0) oder bewirkt, dass die Hauptmethode zurück.

2 Stimmen

In Bezug auf 1.: Wenn Nicht-Daemon-Threads laufen, wird das Programm auch nach der Rückkehr von main() weiterlaufen.

0 Stimmen

JFrames haben eine Methode namens setDefaultCloseOperation die eine dieser Konstanten als Argument annimmt: WindowConstants.HIDE_ON_CLOSE (die Standardeinstellung), WindowConstants.DO_NOTHING_ON_CLOSE , WindowConstants.DISPOSE_ON_CLOSE y JFrame.EXIT_ON_CLOSE

0 Stimmen

Bitte sehen Sie sich diese Antwort zum Ende von main() an: stackoverflow.com/questions/2070951/

1voto

Thunderhashy Punkte 5251

Eine andere Möglichkeit, das Java-Programm zu beenden, ist die Ausführung der letzten Anweisung im Java-Code. Auch wenn ein java.lang.OutOfMemory-Fehler auftritt, wird das Programm abnormal beendet. Dieser Fehler tritt auf, wenn die Java Virtual Machine ein Objekt nicht zuweisen kann, weil der Speicher aufgebraucht ist und der Garbage Collector keinen weiteren Speicher zur Verfügung stellen kann.

0 Stimmen

Was bedeutet das? Was ist, wenn die letzte Codezeile, die von einem bestimmten Thread (z. B. innerhalb eines Runnable) ausgeführt wird, ausgeführt wird, aber noch andere Nicht-Daemon-Threads vorhanden sind?

0 Stimmen

OutOFMemoryErrors sind nicht notwendigerweise fatal, noch beenden sie notwendigerweise die JVM. Sie wird nur beendet, wenn alle Nicht-Daemon-Threads beendet werden. Der Normalfall ist, dass OOME bei einem Thread auftritt, ihn beendet und den Heap von Stack-referenzierten Dingen dieses Threads freigibt. Dann ist entweder genug Speicher vorhanden, um fortzufahren, oder ein anderer Thread wird beendet. Dies wiederholt sich so lange, bis man entweder weiterkommt oder alle Threads beendet sind, wodurch die JVM beendet wird...

0 Stimmen

@Steven: Danke für die Info.

0voto

Adamski Punkte 52945

Ich habe Ihre Frage im Zusammenhang mit Swing-GUIs beantwortet, da Sie folgendes erwähnt haben JFrame .

  • Bei einer Swing-GUI protokolliert der Event-Dispatch-Thread alle auftretenden Ausnahmen, beendet aber die Anwendung in dieser Situation nicht.
  • Wenn ein anderer Thread eine Ausnahme auslöst und beendet wird, sorgt der Event Dispatch-Thread dafür, dass die Anwendung am Leben erhalten wird (da er kein Daemon-Thread ist).
  • Ein letzter Punkt: Wenn Sie möchten, dass Ihre Anwendung beendet wird, wenn ein JFrame geschlossen wird, müssen Sie einen Aufruf machen: setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Andernfalls wird der Rahmen einfach ausgeblendet, wenn Sie ihn schließen, aber die Anwendung wird weiter ausgeführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X