陷阱 - 关闭它时不检查 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);
    }
}