Несоответствия Eclipse: утечка ресурсов: «‹unassigned Closeable value›» никогда не закрывается

Если у меня есть следующий код:

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 из метода, можно не закрывать поток методом (в конце концов, какой смысл возвращать закрытый поток?). Он даже делает это правильно, когда я косвенно возвращаю результат:

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 или он действительно анализирует исходный код или байт-код, чтобы понять это?


person Markus A.    schedule 04.05.2014    source источник
comment
Похоже, это может быть ошибка в статическом анализе. Какую версию Eclipse вы используете? Это было введено в Eclipse 3.8/4.2 и стало значительно лучше в 4.3, а в 4.4 будет больше улучшений. Итак, убедитесь, что вы используете последнюю версию.   -  person Andrew Eisenberg    schedule 05.05.2014
comment
@AndrewEisenberg Я использую Kepler SR 1, который, как я полагаю, имеет версию 4.3.1. Я отправил отчет об ошибке команде Eclipse: bugs.eclipse.org/bugs/ show_bug.cgi?id=434065. Была связанная ошибка (упомянутая там), которая будет исправлена ​​в 4.4. Не уверен, что это исправление также решит эту проблему.   -  person Markus A.    schedule 05.05.2014
comment
Ваш лучший шанс — загрузить последнюю веху 4.4 и посмотреть, исправлена ​​ли она. Поскольку M7 уже вышел, все должно быть довольно стабильно, и переход на него не представляет большой опасности.   -  person Andrew Eisenberg    schedule 05.05.2014


Ответы (1)


Это явно ошибка. Отчет об ошибке https://bugs.eclipse.org/bugs/show_bug.cgi?id=434065 подтвержден, но не исправлен.

Ошибка все еще открыта по состоянию на июль 2019 года.

person Stephen C    schedule 07.07.2019