hallo uwe
Bisher dachte ich, die finally-Klausel ist ein Teil des
try-catch-Blocks. Wieso kann man dann noch einen
try-catch-Block darüber legen? Sicher habe ich dich falsch
verstanden.
stimmt insofern, als dass try-catch-finally immer zusammengehören. sie dürfen aber beliebig geschachtelt werden. manchmal ist das auch unbedingt notwendig.
geht also durchaus sowas:
try {
// mach irgendwas...
try {
int x = Integer.parseInt(eingabe);
} catch (NumberFormatException nfe) {
// defaultwert annehmen
x = 17 ;
}
// mache was anders..
Socket s = new Socket(host,port);
// und weiter
s.flush() ;
} catch (Exception e) {
// fehlermeldung ausgeben
} finally {
try {
s.close() ;
} catch ( Exception e2 ) {
// keine aktion sinnvoll...
}
}
der finally-block wird IMMER ausgeführt - auch im fall einer exception. dementsprechend schließt man normalerweise im finally-block alle ressourcen, damit sie auch im fehlerfall geschlossen werden. da das close aber selbst wieder eine exception werfen kann, muss der befehl eben selbst wieder in einen try-catch-block rein, auch wenn der nicht sonderlich sinnvoll ist (wenn das close nicht geht, kannst du eh nix mehr machen).
natürlch kannst du das finally auch weglassen - im obigen fall, so ein string in einen int umgewandelt wird, hat das finally keinen nutzen.
was ich leider ignoriert habe, ist dass du ja mit servlets arbeitest und daher mit http-requests bzw. responses hantierst. hier greifst du nicht direkt auf den socket zu. statt dessen bekommst du den input- bzw. outputstream direkt zur verfügung gestellt. wenn du den schließt, ist der socket auch gleich zu. vorher natürlich das flush nicht vergessen!
alles klar nun?
lg
erwin