try finally - Streams schließen

Cola_Colin

Top Contributor
Ich habe dieses Konstrukt vor mir:
Java:
        Reader settingsStream = null;
        FileInputStream filein = null;
        ZipInputStream zipin = null;
        try {
// Tue etwas für diese Frage uninteressantes 
        } catch (Exception ex) {
            GameRoot.logError(ex);
        } finally {
            try {
                if (filein != null) {
                    zipin.close();
                    filein.close();
                }
                settingsStream.close();
            } catch (Exception ex) {
            }
        }
Streams soll man ja innerhalb eines finally schließen, vor allem weil hier auch mal Exceptions auftreten werden. Nun wirft aber close auch wieder eine Exception, was ein weiteres try erfordert.
Tritt bei zipin.close schon eine Exception auf, so wird filein schon nicht mehr geschlossen.
Noch ein paar mehr tries zu verschachteln halt ich für schwachsinnig.

Aber was dann ?!
 
>Aber was dann ?!

Bau dir ne Utils Klasse
Java:
public class IOUtils {

public static final void safeClose(InputStream in) {
if(in != null){
try { in.close(); } catch(IOException e) { /* whatever */}
}
}

und das gleich für OutputStream, Reader, Writer, PreparedStatement.....

EDIT:
oder gleich sowas
Commons IO - Home
 
Zuletzt bearbeitet:
Dein finally Block ist falsch.

Wenn zipin.close() IOException wirft, wird der Stream nicht geschlossen, dasselbe bei filein.close().
 
Ok, wird gemacht.
EDIT:
@Maki:
Ja das ist ja das Problem das ich da auch sehe ?!

2ndEdit:

Über das Interface Closeable geht das sogar recht komfortabel.
[Java]
public class IOUtils {
public static final void safeClose(Closeable in) {
try { in.close(); } catch (Exception e) {}
}
}
[/Java]

Sollte man da bei einer Exception noch irgendwas machen ?
 
Zuletzt bearbeitet:
Nö. Was den auch...
Aber null check wäre nicht schlecht.

EDIT:
da evtl Streams im try noch null sind wen schon von einem anderen eine Exception fliegt.
 
Mhmm...wenn die Streams verkettet sind(so wie hier in dem Beispiel wahrscheinlich) reicht es aber allerdings den äußersten Stream zu schließen?!
Also würde es hier doch reichen nur [c]zipin[/c] zu schließen? ???:L
 
Null Check macht Sinn und wird auch gebraucht.

In der Tat sind da zwei der Streams verkettet.
zipin ist ein ZipInputStream der auf filein aufbaut.

settingsStream kann jedoch auch ein anderer sein.

Problem sollte gelöst sein.
 

Zurück
Oben