如果我有以下代码:
public OutputStream test(boolean condition) throws FileNotFoundException {
return condition ? null : new FileOutputStream("test.txt");
}
Eclipse 在
new FileOutputStream("test.txt")
下显示黄色曲线并显示以下警告:
Resource leak: '<unassigned Closeable value>' is never closed
奇怪的是,如果我去掉三元运算:
public OutputStream test() throws FileNotFoundException {
return new FileOutputStream("test.txt");
}
警告消失。
这是 Eclipse 中的不一致(bug?)还是我错过了这两个场景之间的一些根本区别?
总的来说,Eclipse 似乎足够聪明,能够理解当我从方法返回
Closeable
时,不让该方法关闭流是可以的(毕竟,返回一个已关闭的流有什么意义?溪流?)。当我间接返回结果时,它甚至可以正确执行此操作:
public OutputStream test() throws FileNotFoundException {
FileOutputStream result = new FileOutputStream("test.txt");
return result;
}
(这里没有警告)
那么,Eclipse 只是对三元运算感到困惑吗?如果是这样,我应该将其报告为错误吗?
还有一件奇怪的事情:
FileOutputStream
替换为 ByteArrayOutputStream
,警告也会消失:
public OutputStream test(boolean condition) {
return condition ? null : new ByteArrayOutputStream();
}
OutputStream
的直系后代,并实现完全相同的接口(Closeable
、Flushable
、AutoCloseable
)。它是否知道 ByteArrayOutputStream.close()
是一个空操作?如果是这样,是硬编码到 Eclipse 中还是实际上解析源代码或字节码来解决这个问题?
这显然是一个错误。错误报告 https://bugs.eclipse.org/bugs/show_bug.cgi?id=434065 已被确认,但尚未修复。
截至 2019 年 7 月,该错误仍然存在。