5

如果我有以下代码:

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 只是被三元运算搞糊涂了吗?如果是这样,我应该将此报告为错误吗?


另一个奇怪的事情:

如果我替换FileOutputStreamByteArrayOutputStream,警告也会消失:

public OutputStream test(boolean condition) {
    return condition ? null : new ByteArrayOutputStream();
}

为什么它以不同的方式处理这两个流?两者都是直接继承OutputStream并实现完全相同的接口 ( Closeable, Flushable, AutoCloseable)。它是否以某种方式知道这ByteArrayOutputStream.close()是一个空操作?如果是这样,是硬编码到 Eclipse 中还是它实际上解析源代码或字节码来解决这个问题?

4

1 回答 1

0

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

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

于 2019-07-07T15:20:45.997 回答