『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節のコードです。この解答も間違っています。何が間違っているか分かりますか?『Effective Java 第3版』の「項目9 try-finally よりもtry-with-resources を選ぶ」に解説されています。
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
// closeが失敗しても、できることはない
}
}
if (out != null) {
try {
out.close();
} catch (IOException ex) {
// 再度、closeが失敗しても、できることはない
}
}
}


この記事へのコメント