Ist finally nicht überflüssig?

Hallo!

Wenn ich mal etwas genauer über das Schlüsselwort finally nachdenke, dann erscheint es mir zunehmend überflüssig. Per Definition führt es nach einem try/catch den umschlossenen Code auf jeden fall (also unabhängig von einer eventuellen Exception aus.
Aber wenn ich eine Exception ordentlich abfange, wird der code nach dem try/catch - auch wenn er nicht in finally eingeschlossen ist - ebenso garantiert ausgeführt. Diese Beispiele sollten also äquivalent sein:

try
{
 throw new Exception("test");
}
catch(Exception e)
{
 // abgefangen
}
finally
{
 syso("ausgeführt");
}

und

try
{
 throw new Exception("test");
}
catch(Exception e)
{
 // abgefangen
}

syso("ausgeführt");

Wozu also finally?

Moien

Wenn ich mal etwas genauer über das Schlüsselwort finally
nachdenke, dann erscheint es mir zunehmend überflüssig.

Es ist meistens Deko. Allerdings gibt es eine echte Ausnahme:

try{
 ...
 if (Bad-thing-happend){
 return 0;
 }
 ...
catch (Exception e){ ... }
finaly { ...wird auch bei return 0 ausgeführt... }

Das gleiche Spiel gilt für break und continue.

cu

Ahhhh, siehste mal, an den Fall hab ich nicht gedacht. Danke für die Antwort!

Eine weiterer Fall, wo try-catch-finally häufig gebraucth wird, sind datenbankverbindungen

Connection con = null;
Statement stmt = null;
try{
 con = DriverManager.createConnection();
 stmt = con.createStatement();
 stmt.executeUpdate("DELETE FROM table");
 return -1;
}
/\* Catch Kann acuh weggelassen werden \*/
catch(Exception e){
 e.printStacktrace();
 throw e;
}
finally{
 if(stmt != null) stmt.close();
 if(con != null) con.close();
}

Das hat den vorteil, dass egal ob der Code eine Exception wirft oder vollständig durchlaufen wird, werden bevor die Methode verlassen wird noch die „aufräumarbeiten“ durchgeführt. Das gleiche ist auch bei Filehandles zu empfehlen

LG Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

ergaenzend zu den bereits gegebenen Antworten:

http://java.sun.com/docs/books/tutorial/essential/ex…

Gruss
Patrick