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

为什么 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个修改后的版本,这些版本都可以(没有警告)。


模组 #1:如果我从块中删除循环,警告就会消失:fortry

// 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:如果我保留循环,也没有警告,但我删除了包装:forZipInputStream

// 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();
}

模组 #3:如果我在外面创建,也没有警告:InputStreamtry-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中一个已知的错误:[编译器][资源]返回内部时出现错误的资源泄漏问题,而循环(资源在最终块中传递

我自己也得到了这个,并在跟踪器上添加了我的投票。

更新:上述错误已在4.5 M7中得到解决。这将包含在Eclipse 4.5(“Mars”)的最终版本中 - 预计将于2015-06-24发布。


答案 2

推荐