Der gesamte Java-Code wird im Kontext eines Threads ausgeführt . Das verknüpfte JavaDoc erklärt die Fehlerbehandlungs- und Beendigungskriterien, aber hier ist der Kern davon:
- Die JVM dreht sich selbst und bereitet die Ausführungsumgebung vor.
- Die JVM erstellt einen Thread, der die
main()
Methode unter Verwendung der anwendbaren Befehlszeilenparameter ausführt.
- Die JVM legt einen Standard-Handler für nicht erfasste Ausnahmen fest, der die Ausnahme als Standardfehler druckt und beendet.
- Die JVM führt den Thread aus.
Im Falle einer nicht erfassten Ausnahme stirbt das Programm effektiv gemäß dem oben genannten dritten Punkt. Dieses Verhalten wird in der Java-Sprachspezifikation, Abschnitt 11.3, näher spezifiziert
zusätzliche Information
Andere haben statische Blöcke erwähnt und wie sie zuvor ausgeführt wurden main()
. Dies erfordert jedoch etwas mehr Erklärung, um richtig zu verstehen.
Beim Laden einer Klasse muss der Klassenlader alle static final
Status initialisieren und alle static
Blöcke ausführen , bevor die Klasse verwendet werden kann, um instanziierende Instanzen der Klasse einzuschließen (abgesehen davon: Erstellen Sie eine Java-Klasse, in der eine Klassenkonstante in einem statischen Block nach dem Erstellen eines initialisiert wird Instanz der Klasse, und der Konstruktor verweist auf die Konstante. Boom!). Dies alles geschieht jedoch in der Klassenladelogik, bevor ein Code auf die Klasse verweisen kann . Darüber hinaus wird die Klasse in den Thread geladen, auf den die Klasse verwiesen hat.
Dies bedeutet, dass wenn die Klasse, die main()
Referenzen enthält, auf eine andere Klasse verweist (z. B. Klassenkonstante), diese Klasse vor der Ausführung geladen werden mussmain()
, um ihre statischen Blöcke einzuschließen. Andernfalls werden die statischen Blöcke wie oben ausgeführt. Wenn die Klasse nicht geladen werden kann, kann auch die enthaltende Klasse main()
nicht geladen werden und das Programm wird beendet.
Ein weiteres FYI: statische Blöcke können werfen. Errors
werden wie sie sind geworfen. Exceptions
sind verboten (Kompilierungsfehler). RuntimeExceptions
sind in ExceptionInInitializerError eingeschlossen . Diese werden gemäß dem nicht erfassten Ausnahmebehandler behandelt, der normalerweise entweder den Thread oder die Anwendung (Hauptthread) beendet, es sei denn, Sie wickeln die Klassenreferenz (und das Laden) sorgfältig in ein try
- ein catch
.