Ich überprüfe einen neuen Code. Das Programm hat nur einen Versuch und einen Endblock. Wie funktioniert der try-Block, wenn der catch-Block ausgeschlossen ist, wenn er auf eine Ausnahme oder etwas Auslösbares stößt? Geht es nur direkt zum Endblock?
java
try-catch
finally
try-catch-finally
try-finally
NullPointer0x00
quelle
quelle
Antworten:
Wenn einer der Codes im try-Block eine aktivierte Ausnahme auslösen kann, muss er in der throw-Klausel der Methodensignatur erscheinen. Wenn eine nicht aktivierte Ausnahme ausgelöst wird, wird sie aus der Methode entfernt.
Der finally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wird oder nicht.
quelle
Ein kleiner Hinweis zu
try
/finally
: Das wird immer ausgeführt, es sei dennSystem.exit()
wird genannt.try{}
Block endet nie (zB Endlosschleife).quelle
try{..} catch{ throw ..} finally{..}
? Ich denke, endlich wird nicht hingerichtetDie Java-Sprachspezifikation (1) beschreibt, wie
try-catch-finally
ausgeführt wird. Kein Fang zu haben ist gleichbedeutend damit, keinen Fang zu haben, der in der Lage ist, den gegebenen Wurf zu fangen.(1) Ausführung von try-catch-finally
quelle
Das innere wird schließlich ausgeführt, bevor die Ausnahme auf den äußeren Block geworfen wird.
Ergebnisse in
quelle
Der finally-Block wird immer ausgeführt, nachdem der try-Block beendet wurde, unabhängig davon, ob der try-Vorgang aufgrund einer Ausnahme normal oder abnormal beendet wurde.
Wenn eine Ausnahme von einem der Codes im try-Block ausgelöst wird, löst die aktuelle Methode dieselbe Ausnahme einfach erneut aus (oder löst sie weiterhin aus) (nachdem der finally-Block ausgeführt wurde).
Wenn der finally-Block eine Ausnahme / error / throwable auslöst und bereits ein ausstehendes throwable vorhanden ist, wird es hässlich. Ehrlich gesagt vergesse ich genau, was passiert (so viel zu meiner Zertifizierung vor Jahren). Ich denke beide Throwables werden miteinander verbunden, aber es gibt ein spezielles Voodoo, das Sie tun müssen (dh einen Methodenaufruf, den ich nachschlagen müsste), um das ursprüngliche Problem zu lösen, bevor sich das "endgültige" Barfed, ähm, übergeben hat.
Übrigens ist try / finally eine ziemlich häufige Aufgabe für das Ressourcenmanagement, da Java keine Destruktoren hat.
Z.B -
"Endlich", noch ein Tipp: Wenn Sie sich die Mühe machen, einen Fang einzufügen, fangen Sie entweder bestimmte (erwartete) Wurf-Unterklassen oder fangen Sie einfach "Wurfbar", nicht "Ausnahme", für eine allgemeine Fehlerfalle. Zu viele Probleme, wie z. B. Reflexionsfehler, werfen eher "Fehler" als "Ausnahmen" aus, und diese rutschen direkt an jedem "Fang alle" vorbei, der wie folgt codiert ist:
Tun Sie dies stattdessen:
quelle
Java-Versionen vor Version 7 ermöglichen diese drei Kombinationen von try-catch-finally ...
finally
Der Block wird immer ausgeführt, unabhängig davon, was imtry
oder / undcatch
Block vor sich geht. Wenn also keincatch
Block vorhanden ist , wird die Ausnahme hier nicht behandelt.Sie benötigen jedoch weiterhin irgendwo in Ihrem Code einen Ausnahmebehandler - es sei denn, Sie möchten, dass Ihre Anwendung natürlich vollständig abstürzt. Es hängt von der Architektur Ihrer Anwendung ab, wo genau sich dieser Handler befindet.
quelle
Die Ausnahme wird aus dem Block geworfen, genau wie in jedem anderen Fall, in dem sie nicht abgefangen wird.
Der finally-Block wird unabhängig davon ausgeführt, wie der try-Block verlassen wird - unabhängig davon, ob überhaupt Catches vorhanden sind, unabhängig davon, ob ein passender Catch vorhanden ist.
Die Fangblöcke und die schließlich sind orthogonale Teile des Versuchsblocks. Sie können eines oder beide haben. Mit Java 7 können Sie beides nicht haben!
quelle
Versuchen Sie es nicht mit diesem Programm? Es wird endgültig blockiert und der endgültige Block ausgeführt, aber die Ausnahme wird nicht behandelt. Diese Ausnahme kann jedoch im finally-Block außer Kraft gesetzt werden!
quelle
Der finally-Block wird ausgeführt, nachdem der try-Block abgeschlossen ist. Wenn beim Verlassen etwas in den try-Block geworfen wird, wird der finally-Block ausgeführt.
quelle
Innerhalb des
try
Blocks schreiben wir Codes, die eine Ausnahme auslösen können. In demcatch
Block behandeln wir die Ausnahme. Derfinally
Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme auftritt oder nicht.Wenn wir nun try-finally-Block anstelle von try-catch-finally-Block haben, wird die Ausnahme nicht behandelt, und nach dem try-Block anstelle der Steuerung, die den Block abfängt, wird sie endgültig blockiert. Wir können den try-finally-Block verwenden, wenn wir mit der Ausnahme nichts tun möchten.
quelle
Unabhängig davon, welche Ausnahme im
try
Block ausgelöst wird oder nicht, wird der Blockfinally
ausgeführt. Ausnahme würde nicht gefangen werden.quelle