陷阱 - 关闭它时不检查 IO 流是否甚至未初始化
为防止内存泄漏,不应忘记关闭作业完成的输入流或输出流。这通常是使用 try
-catch
-finally
语句完成的,没有 catch
部分:
void writeNullBytesToAFile(int count, String filename) throws IOException {
FileOutputStream out = null;
try {
out = new FileOutputStream(filename);
for(; count > 0; count--)
out.write(0);
} finally {
out.close();
}
}
虽然上面的代码可能看起来很无辜,但它有一个缺陷,可能使调试无法进行。如果 out
初始化的行(out = new FileOutputStream(filename)
)抛出一个异常,那么当执行 out.close()
时 out
将是 null
,导致一个讨厌的 NullPointerException
!
要防止这种情况,请在尝试关闭之前确保该流不是 null
。
void writeNullBytesToAFile(int count, String filename) throws IOException {
FileOutputStream out = null;
try {
out = new FileOutputStream(filename);
for(; count > 0; count--)
out.write(0);
} finally {
if (out != null)
out.close();
}
}
更好的方法是使用资源,因为它会自动关闭流,概率为 0,无需使用 finally
块即可抛出 NPE。
void writeNullBytesToAFile(int count, String filename) throws IOException {
try (FileOutputStream out = new FileOutputStream(filename)) {
for(; count > 0; count--)
out.write(0);
}
}