Странная "утечка ресурсов: поток никогда не закрывается" с помощью 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.