如果我有以下代码:
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 中的不一致(错误?)还是我错过了这两种场景之间的一些根本区别?
一般来说,Eclipse 似乎足够聪明,可以理解当我Closeable
从方法返回 a 时,可以不让方法关闭流(毕竟,返回关闭的流有什么意义?)。当我间接返回结果时,它甚至可以正确执行此操作:
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 中还是它实际上解析源代码或字节码来解决这个问题?