java Eclipse不一致:资源泄漏:'〈unassigned Closeable value>'永远不会关闭

e7arh2l6  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(208)

如果我有下面的代码:

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的直接后代,并且实现了完全相同的接口(CloseableFlushableAutoCloseable)。它是否知道ByteArrayOutputStream.close()是一个no-op?如果是,它是硬编码到Eclipse中的,还是实际解析源代码或字节码来解决这个问题?

wnavrhmk

wnavrhmk1#

这显然是一个错误。错误报告https://bugs.eclipse.org/bugs/show_bug.cgi?id=434065已被确认,但尚未修复。
该漏洞截至2019年7月仍在开放中。

相关问题