Eclipse inconsistencies: Resource leak: '' is never closedJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Eclipse inconsistencies: Resource leak: '' is never closed

Сообщение Anonymous »

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

Код: Выделить всё

public OutputStream test(boolean condition) throws FileNotFoundException {
return condition ? null : new FileOutputStream("test.txt");
}
Eclipse помещает желтые волнистые линии под новым FileOutputStream("test.txt") и показывает следующее предупреждение:

Код: Выделить всё

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

Подробнее здесь: https://stackoverflow.com/questions/234 ... e-is-never
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»