Странная "утечка ресурсов: поток никогда не закрывается" с помощью try-with-resources, если исключение выбрано в цикле
Почему Eclipse дает странное сообщение "Ошибка утечки ресурсов: zin никогда не закрывается" для следующего кода, хотя я использую try-with-resources
:
Path file = Paths.get("file.zip");
// Resource leak warning!
try (ZipInputStream zin = new ZipInputStream(Files.newInputStream(file))) {
for (int i = 0; i < 5; i++)
if (Math.random() < 0.5)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
Если я изменю "что-либо" в коде, предупреждение исчезнет. Ниже я перечисляю 3 измененных версии, которые все в порядке (никаких предупреждений).
Mod # 1: Если я удаляю цикл for
из блока try
, предупреждение уходит:
// This is OK (no warning)
try (ZipInputStream zin = new ZipInputStream(Files.newInputStream(file))) {
if (Math.random() < 0.5)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
Mod # 2: Также нет предупреждений, если я сохраняю цикл for
, но я удаляю wrapping ZipInputStream
:
// This is OK (no warning)
try (InputStream in = Files.newInputStream(file))) {
for (int i = 0; i < 5; i++)
if (Math.random() < 0.5)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
Mod # 3: Если я создаю InputStream
вне try-with-resources
, также нет предупреждений:
// This is also OK (no warning)
InputStream in = Files.newInputStream(file); // I declare to throw IOException
try (ZipInputStream zin = new ZipInputStream(in)) {
for (int i = 0; i < 5; i++)
if (Math.random() < 0.5)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
Я использую Eclipse Kepler (4.3.1), но также тот же результат с Kepler SR2 (4.3.2).
Ответы
Ответ 1
Это, по-видимому, известная ошибка в Eclipse: [компилятор] [ресурс] Плохая проблема утечки ресурсов при возврате внутри цикла while (ресурс, переданный в блок finally.
Я просто добрался до этого сам и добавил свой голос в трекер.
Обновление: Вышеупомянутая ошибка была решена в 4.5 M7. Это будет включено в окончательный выпуск Eclipse 4.5 ( "Mars" ), который будет выглядеть на пути к выпуску 2015-06-24.