Eclipse 不一致:资源泄漏:“<unassigned Closeable value>”从未关闭

问题描述 投票:0回答:1

如果我有以下代码:

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 中还是实际上解析源代码或字节码来解决这个问题?

java eclipse autocloseable
1个回答
0
投票

这显然是一个错误。错误报告 https://bugs.eclipse.org/bugs/show_bug.cgi?id=434065 已被确认,但尚未修复。

截至 2019 年 7 月,该错误仍然存在。

© www.soinside.com 2019 - 2024. All rights reserved.