如果在循环中抛出异常,则使用try-with-resources奇怪的“资源泄漏:流永远不会关闭”

时间:2014-04-25 13:29:58

标签: java eclipse warnings compiler-warnings 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();
}

如果我修改&#34;任何事情&#34;在代码上,警告消失了。下面我列出了3个修改过的版本都没问题(没有警告)。


修改#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();
}

默认#2:如果我保留for循环但我删除了换行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 个答案:

答案 0 :(得分:19)

这似乎是Eclipse中的已知错误: [compiler][resource] Bad resource leak problem on return inside while loop (resource passed on in finally block

我自己也对此感到满意,并在追踪器上添加了投票。

更新:上述错误已在4.5 M7中解决。这将包含在Eclipse 4.5的最终版本中(&#34; Mars&#34;) - 它有望在2015-06-24发布。