如果我有下面的代码:
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;
}
(no警告)
那么,Eclipse是否只是被三元运算搞糊涂了呢?如果是这样,我应该把它作为一个bug报告吗?
另一件怪事:
如果将FileOutputStream
替换为ByteArrayOutputStream
,警告也会消失:
public OutputStream test(boolean condition) {
return condition ? null : new ByteArrayOutputStream();
}
为什么它对这两个流的处理方式不同呢?这两个流都是OutputStream
的直接后代,并且实现了完全相同的接口(Closeable
、Flushable
、AutoCloseable
)。它是否知道ByteArrayOutputStream.close()
是一个no-op?如果是,它是硬编码到Eclipse中的,还是实际解析源代码或字节码来解决这个问题?
1条答案
按热度按时间wnavrhmk1#
这显然是一个错误。错误报告https://bugs.eclipse.org/bugs/show_bug.cgi?id=434065已被确认,但尚未修复。
该漏洞截至2019年7月仍在开放中。