Beispiel für sinnvolles finally?

Status
Nicht offen für weitere Antworten.

Michi

Mitglied
Hi,

hat jemand mal ein Beispiel für ein finally, in dem es einen praktischen Nutzen erfüllt oder ist finally allgemein formell-ästethischer Art? Ich mein, ich kann doch etwas, das so oder so ausgeführt wird - also ob ein Fehler aufgetreten ist oder nicht - auch außerhalb eines finally-Blocks schreiben, ist der Effekt da nicht der gleiche?

Ciao!
Michi
 
Code:
InputStream einStream = ...;
try {
   einStream.read(blupp);
} catch(IOException ex) {
   // blzpp
} finally {
   einStream.close();
}
 
Code:
public void getSomeDataFromDB(String query) throws SQLException {
   Connection con = ...;
   try{
      con.exec(query);

   }
   finally{
      con.close(); 
  }
}
 
Sorry, ich versteh den Sinn von finally nicht... Das sind für mich ja auch wieder zwei Beispiele, wo man es doch einfach weglassen könnte. Im zweiten Fall braucht mans halt, weils Java so will, aber man könnte das close doch genauso auch ausm finally rausnehmen. Ich verstehe nicht, was durch das finally vom Ablauf her (!) anders wird oder sollte es echt so sein, dass Programme dadurch lediglich schöner zu lesen sein sollen?
 
Zu meinem Beispiel, wenn du es ohne finally machen würdest:
Code:
public void getSomeDataFromDB(String query) throws SQLException {
   Connection con = ...;
   con.exec(query);
   con.close();
}

würde er die Verbindung nicht schließen wenn con.exec(query); eine SQLException geworfen wird, da er gar nicht mehr zu der Zeile con.close(); gelangt, was bei der finally Variante nicht der fall wäre da er den finally Block immer ausführt egal ob eine Exception geworfen wurde oder nicht.
Sprich der finally-Block wird ausgeführt nachdem der try oder catch block ausgeführt wurde oder bevor die Methode durch ein return oder durch das Werfen einer Exception verlassen wird (komisches Deutsch).
 
stevg hat gesagt.:
Code:
public void getSomeDataFromDB(String query) throws SQLException {
   Connection con = ...;
   try{
      con.exec(query);

   }
   finally{
      con.close(); 
  }
}

da muss dein con.close aber auch wiederum im finally-block in ein try/catch rein
 
Das is doch nur ein Beispiel. Die Klasse Connection ist nur ausgedacht und kann in diesem Fall keine Exception werfen.
Aber nagut:
Code:
public void getSomeDataFromDB(String query) throws SQLException, ConnectionException {
   Connection con = ...;
   try{
      con.exec(query);

   }
   finally{
      con.close();
  }
}
 
DP hat gesagt.:
stevg hat gesagt.:
Code:
public void getSomeDataFromDB(String query) throws SQLException {
   Connection con = ...;
   try{
      con.exec(query);

   }
   finally{
      con.close(); 
  }
}

da muss dein con.close aber auch wiederum im finally-block in ein try/catch rein
ne die SQLException wird ja weitergeleitet. udn wenn man die connection nich shcließen kann ist sie wohl shcon geschlossen dann muss man nix mehr schließen :bae.
 
Wenn con.close(); eine Exception werfen kann muss die abgefangen werden, oder was meinst du?
 
stevg hat gesagt.:
Sprich der finally-Block wird ausgeführt nachdem der try oder catch block ausgeführt wurde
So weit, so gut, so klar. Nur hab ich da bisher keinen Vorteil im finally gesehen.

stevg hat gesagt.:
oder bevor die Methode durch ein return oder durch das Werfen einer Exception verlassen wird (komisches Deutsch).

Ich denke, das ist der entscheidende Punkt, der dem finally einen Sinn gibt.
Bevor eine Methode durch ein return im catch-Teil beendet wird, wird noch finally aufgerufen...
Ansonsten kann mans ja so gesehen auch weglassen, aber sobald im catch-Teil was drin ist, was zur Beendigung der Methode führt, macht finally Sinn, das ist es! 😀
 
Man will die Verbindung ja auch schließen wenn kein Fehler kommt oder meinst du was anderes?
 
Sicher war's so gemeint
Code:
public void getSomeDataFromDB(String query) throws SQLException { 
  Connection con = ...; 
  try{ 
    con.exec(query); 
  } 
  catch(SQLException e) {
    logger.error(e);
    throw e;
  }
  finally{ 
    con.close(); 
  } 
}
 
der Vorteil (das Besondere) von finally ist, dass der Block auch dann ausgeführt wird, wenn im try eine Exception fliegt, die NICHT abgefangen wird

=> in diesem Fall würde ja normalerweise einfach abgebrochen und das ganze an den Aufrufer zurückgegeben...; nur mit finally kannst du auf diesen Fall reagieren!
 
ja - aber wenn sie "weiter oben" abgefangen und korrekt behandelt wird, muss man "unten" trotzdem noch ein ressource.close() absetzten -
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben