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

『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
  • メディア: 大型本

この記事へのコメント