1

我有 Eclipse 发出以下警告:

Potential resource leak: '<unassigned Closeable value>' may not be closed

new BufferedWriter(...)...对于以下片段中的表达式:

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = useStdout ? new OutputStreamWriter(System.out) : new BufferedWriter(new FileWriter(new File(askUserForFilename())));
try {
    writer.write("Hello World!");
}
finally {
    writer.close();
}

这是误报吗?我理解整个Writer事情的方式是,任何作家都会关闭其潜在的作家。在我的情况下,writer将封装新的缓冲写入器(进而封装文件写入器),因此关闭writer不应泄漏与缓冲写入器或其底层写入器关联的任何资源?

我在这里想念什么?

4

3 回答 3

2

根据更新的问题编辑答案:

这是一个虚假的警告 - 基于三元运算符的使用。如果操作的右侧没有触发,BufferedWriter则不会创建,并且没有资源泄漏。所以警告所描述的实际上是不可能的。但是,如果您想“处理”它,只需将编写器的创建移动到您的 try 块中。

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
于 2013-04-10T11:33:50.613 回答
1

你能检查一下这段代码是否给你警告吗?如果不是,那么您可能在创建 writer 时没有处理 IOException,这也应该在 try 块中完成。

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

您还可以使用 try-with-resources,它会在 try 块后自动关闭资源流。

boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}
于 2013-04-10T11:54:44.540 回答
1

如果writer.write("Hello World!");抛出异常,writer.close()则永远不会调用。

尝试将其包装到 try-catch 块中(可能利用自动关闭功能,请参阅http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。

于 2013-04-10T11:34:58.620 回答