Sinnhaftigkeit von try-finally?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es garantiert, dass beim Verlassen des Blocks aus beliebigem Grund der Code im finally-Block ausgeführt wird.

Also zB auch, wenn eine unchecked Exception geworfen wird, egal ob für sie ein catch vorhanden ist oder nicht. Oder wenn der catch-Block vorzeitig beendet wird.

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.2

Unchecked Exceptions werden in den Beispielen korrekt behandelt. Das Problem sind andere Throwables, wie z.B. Error.

2
@oopexpert

Schon klar, wobei die Beispiele des FS nicht sonderlich sinnvoll sind. Es ist nicht oft nötig oder eine gute Idee, "java.lang.Exception" zu fangen.

1
@alfredo153

Eine Exception zu fangen oder weiterzureichen ist immer kontextabhängig. Es gibt keinerlei technische Indikation in die eine oder andere Richtung, sondern nur eine semantische.

1
@alfredo153

Kurz gesagt: ob es eine gute oder schlechte Idee ist, kann man ohne Kontext nicht sagen.

1

In deinen Beispielen macht das tasächlich nur wenig Unterschied, aber es gibt einen.

Dein Code würde sich anders Verhalten, wenn dein Throwable keine Exception sondern ein Error ist. Beispiel A würde reset() aufrufen, Beispiel B nicht.

Zudem:

Je nach Situation möchte man eine kontextbezogene Exception nach außen geben (und die eigentliche Exception nicht behandeln), wenn eine abstrakte Exception "gefangen" wird. Ein rethrow eine kontextbezogenen Exception würde dazu fürhren, dass reset im Beispiel A ausgeführt wird und in Beispiel B nicht.

Der Code im finally wird (fast) immer ausgeführt, auch im Falle einer Exception. In Beispiel B wird reset() z.B. nicht ausgeführt

  • wenn eine Exception geworfen wird, die nicht vom Typ Exception ist. In diesem Falle gibt es keine, aber angenommen du catchst nur DivideByZeroExceptions, dann würde das vom Catch-Block nicht gefangen und reset() nicht ausgeführt, da die Methode sofort zum Aufrufer zurückkehrt, sobald die Exception fliegt.
  • Wenn im Catch-Block selbst eine Exception geworfen wird, also in handleException(). Man sieht manchmal catch-Blöcke, die eine Fehlermeldung in die Datenbank schreiben sollen, damit sich eine Admin das anschauen kann. Was aber, wenn die Verbindung zur Datenbank gestört ist? Dann wirft der Catch-Block selbst eine Exception...
Woher ich das weiß:Berufserfahrung

Im Beispiel A wird selbst dann finally ausgeführt, wenn im catch-Zweig die Funktion verlassen werden würde.

Man nutzt das häufig zum Freigeben von Speicher. Es wird ein valider Zustand wieder hergestellt.

Woher ich das weiß:Beruf – Programmierer

Moment, also selbst wenn ich in Catch block ein return habe, wird der finally Block ausgeführt?

1

Es ist glaube ich die Reihenfolge, ob erst reset() oder handleException() ausgeführt wird.

Und wenn ein Throwable geworfen wird, welches keine Instanz von Exception ist, fliegst du im Beispiel B raus, ohne reset() aufgerufen zu haben.

Was möchtest Du wissen?