Was ist der Kern von endlich in Java zu blockieren?

8

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%     
abuzittin 30.06.2010, 08:51
quelle

7 Antworten

17

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???" :

%Vor%

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 print -Anweisung ist?

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.

    
polygenelubricants 30.06.2010, 08:56
quelle
8

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:

  • Dies ist nur der aktuelle Status des Codes, und er kann sich in Zukunft ändern - können Sie garantieren, dass der zukünftige Programmierer, der in den 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.
Péter Török 30.06.2010 08:53
quelle
2

Sie verwenden den Block finally , um Code zu bereinigen und auszuführen, der ausgeführt werden soll, unabhängig davon, ob eine Ausnahme ausgelöst (und abgefangen) wurde oder nicht. Dazu gehört Code, den Sie im Block catch haben.

    
Oded 30.06.2010 08:53
quelle
1

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.

    
ravinikam 30.06.2010 08:58
quelle
0

Beachten Sie, dass Sie sogar versuchen können - endlich ohne einen Haken:

%Vor%

Ein Beispiel könnte also eine Methode sein, die Ausnahmen an den Aufrufer weitergeben möchte, aber immer noch Bereinigungscode benötigt, wie zum Beispiel das Freigeben eines Looks.

    
b_erb 30.06.2010 09:00
quelle
0

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.

    
Tushar Tarkas 30.06.2010 09:08
quelle
0

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%     
Benoit Courtine 30.06.2010 10:30
quelle