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