Endlich habe ich Zeit gehabt, mich etwas mit “finally” von Java zu beschäftigen (sprich: Internet bemüht, ausprobiert), hab’ ich mich doch schon öfter gefragt, wozu man das braucht.
Anwendungsbeispiel: ein Datenstrom soll geöffnet, gelesen und geschlossen werden. Dabei können IO-Fehler (und andere Fehler) auftreten, die abgefangen werden sollen. Tritt ein Fehler auf, soll der Strom geschlossen werden. Bisher habe ich das so programmiert:
oder auch so:
Beide Lösungen haben zwei Nachteile: Erstens muss ich den InputStream vor dem try definieren, damit ich ihn im catch oder danach schließen kann. Zweitens rufe ich zweimal close auf, bei jeder Codeänderung ist das ein potentieller Fehlerfall.
Mein bisheriges Verständnis von finally führte dann zu folgendem Code:
Immerhin ein close eingespart, aber elegant ist das noch nicht und das erste Problem ist noch nicht gelöst. Nach dem ausgiebigen Webseitenstudium präferiere ich folgende Lösung:
Das ist jetzt elegant. das erste try sorgt für die Verarbeitung der Exceptions, die auf jeden Fall abgearbeitet werden, da das zweite try keinen catch-Block hat. Das zweite try sorgt aber dafür, dass der Datenstrom auf jeden Fall geschlossen wird. Fehler beim Schließen werden ebenfalls abgefangen. Außerhalb des ersten try-catch-Blocks ist der Datenstrom nicht sichtbar, die Variablenkapselung funktioniert.
Update (7.2.10): die Code-Formatierung war komplett daneben, komplett erneuert.
Update 2 (7.2.10): die Formatierung der Webseite zeigt jetzt den Code an 🙂