Почему 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).