SSブログ

『Effective Java 第3版』と『Java Puzzlers』ー パズル41ー [Effective Java 第3版]

『Effective Java 第3版』で最初に言及されているのは、パズル41の解答です。パズル41は、以下の通りです。
パズル41 フィールドとストリーム(Field and Stream)

次のメソッドは、1つのファイルを他のファイルへコピーし、I/Oエラーが発生しても、生成したすべてのストリームをクローズするように設計されていました。残念ながら、常にそのようには動作しません。なぜ動作しないのでしょうか? 修正することができますか?
static void copy(String src, String dest) throws IOException {
    InputStream in = null;
    OutputStream out = null;
    try {
        in = new FileInputStream(src);
        out = new FileOutputStream(dest);
        byte[] buf = new byte[1024];
        int n;
        while ((n = in.read(buf)) > 0)
            out.write(buf, 0, n);
    } finally {
        if (in != null) in.close();
        if (out != null) out.close();
    } 
}
言及されているのは、このパズルの解答として書かれていたfinally節のコードです。
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException ex) {
            // closeが失敗しても、できることはない
        }
    }
    
    if (out != null) {
        try { 
            out.close(); 
        } catch (IOException ex) {
            // 再度、closeが失敗しても、できることはない 
        } 
    } 
}
この解答も間違っています。何が間違っているか分かりますか?『Effective Java 第3版』の「項目9 try-finally よりもtry-with-resources を選ぶ」に解説されています。

Effective Java 第3版

Effective Java 第3版

  • 作者: Joshua Bloch
  • 出版社/メーカー: 丸善出版
  • 発売日: 2018/10/30
  • メディア: 単行本(ソフトカバー)

Java Puzzlers 罠、落とし穴、コーナーケース

Java Puzzlers 罠、落とし穴、コーナーケース

  • 作者: ジョシュア・ブロック
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2005/11/14
  • メディア: 大型本


コメント(0)