Wir wissen, dass unabhängig davon, ob eine Ausnahme ausgelöst oder abgefangen und behandelt wird, der finally Block ausgeführt wird. Also war ich neugierig, dass es irgendeine Möglichkeit gibt, dass der Block schließlich nicht ausgeführt wird.
Und wenn System.exit () entweder in try oder catch aufgerufen wird, wird auch das schließlich aufgerufen?
Wenn die JVM beendet wird, während der Code
try
odercatch
ausgeführt wird, wird der Blockfinally
möglicherweise nicht ausgeführt. Wenn der Thread, der dentry
- odercatch
-Code ausführt, unterbrochen oder gelöscht wird, wird derfinally
-Block möglicherweise nicht ausgeführt, obwohl die Anwendung insgesamt fortgesetzt wird.
Quelle: java.sun.com: Java-Lernprogramm: Der endgültige Block
In der Java-Dokumentation:
Es erklärt schließlich sehr gut.
Sie beachten, dass, wenn die JVM beendet wird, der endgültige Block nicht aufgerufen wird. Oder wenn ein Thread, der den Codeblock ausführt, getötet wird, wird der finally-Block nicht aufgerufen. In allen anderen Fällen wird es.
Eine Sache, an die ich gerade denken kann, ist OutOfMemoryError
. In diesem Fall besteht die Möglichkeit, dass kein weiterer Code in Ihrer App ausgeführt werden kann.
Wenn einige Java Native Interface-Methoden segfaults (eine Bibliotheksfunktion außerhalb von Java, aber von dort abstürzt), wird auch eine finally-Methode nicht aufgerufen, weil die gesamte JVM aufhört.
Fehler in der JVM selbst führen ebenfalls zu einem Absturz und verhindern die weitere Ausführung.
Die finally-Klausel im try-catch-Ausnahmeblock wird immer ausgeführt, unabhängig vom Auftreten einer Ausnahme im normalen Java-Programmablauf. Wenn der Ausführungsfluss vor der finally-Klausel gestoppt wird, wird der finally-Block nicht ausgeführt.
Wir können System.exit(1);
verwenden, bevor wir den Ausführungsablauf des Programms endgültig blockieren und stoppen.