Ich denke an die folgenden Beispiele; aber konnte nicht herausfinden, wie wichtig der finally Block ist. Können Sie mir den Unterschied der Ausführungen dieser beiden Codebeispiele erklären? Auch ein reales Beispiel kann hilfreich sein.
Beispiel 1:
%Vor%Beispiel 2:
%Vor% Es gibt einen großen Unterschied in den beiden Snippets, die Sie vorgestellt haben, z. Wenn der Block catch
selbst eine Ausnahme auslöst, wird der Block finally
immer noch nach seiner Semantik ausgeführt.
Das folgende Snippet druckt "Finally!"
, aber nicht "What about me???"
:
Im Allgemeinen wird der finally
eines try
block praktisch immer ausgeführt. Es gibt keine Garantie für Code nach dem try
-Block.
Aber was, wenn mein
catch
-Block nur eine einfache
Es gibt immer noch keine Garantie , dass es nicht throw
etwas ist. Etwas könnte z.B. in z.B. die Konstruktion für die Ausnahmedetailnachricht.
Auch wenn Sie sich bemühen, dass der Code catch
"sicher" ist und der Code, der auf die Anweisung try
folgt, immer ausgeführt wird, lautet die Frage "Warum?". Warum sollte finally
vermieden werden, aber versuchen Sie dann so sehr, seine Semantik zu replizieren?
finally
Semantik ist garantiert und erfordert keine Beweislast seitens des Schreibers oder Lesers des Codes. Gerade deshalb ist es idiomatisch , finally
block zu verwenden, um einen obligatorischen "Clean-Up" -Code zu erstellen. Die Verwendung von finally
garantiert die Korrektheit und verbessert sowohl die Schreibbarkeit als auch die Lesbarkeit.
Der finally
-Block wird ausgeführt, selbst wenn z. Es wird ein Error
geworfen, das in Ihrem Beispiel nicht vom Block catch
abgefangen wird. Sie können also Bereinigungscode in den Block finally
einfügen, der unabhängig von den Ergebnissen der Operationen in den Blöcken try
und catch
immer ausgeführt werden soll.
Beachten Sie, dass in der Regel catch
-Blöcke spezifischere Arten von Ausnahmen abfangen - oft nur geprüfte Ausnahmen -, daher ist der Unterschied zwischen den beiden Codebeispielen in den meisten Fällen sehr eindeutig.
Update: Sie können sagen, dass Ihr catch
-Block niemals eine Ausnahme auslösen kann, also wird finally
nicht benötigt. Beachten Sie jedoch zwei Dinge:
catch
-Block einen potenziell ausnahmesetzten Code hinzufügt, werden Sie daran denken, den Bereinigungscode danach in einen finally
Block zu legen? try-catch-finally
ist ein Programmier-Idiom , das den Code-Lesern das Verständnis erleichtert. Wenn Sie nicht die allgemeine Redewendung verwenden, riskieren Sie Missverständnisse, also Fehler auf lange Sicht. Es ist hilfreich, wenn wir die Ressourcen freigeben wollen, die wir in try block verwendet haben. Der einzige Ort, an dem sie ausgeführt werden können, ohne auf jeden Fall zu fehlen, ist schließlich Blockade. Wenn eine Ausnahme ausgelöst wird, führt Java keinen Code aus, der unmittelbar danach ausgeführt wird. es springt direkt zum catch-Block.
Falls die Anweisungen im try-Block unchecked Exceptions auslösen, wird der Block schließlich ausgeführt, was es dem Programmierer ermöglicht, die entsprechenden Aktionen auszuführen.
Im echten Leben wird der finally-Block verwendet, um geöffnete Ressourcen zu schließen, selbst wenn eine Ausnahme auftritt. Zum Beispiel beim Lesen (oder Schreiben) einer Datei, beim Zugriff auf eine Datenbank usw.
%Vor%Tags und Links java exception-handling finally