gpt4 book ai didi

java - 奇怪的 "Resource leak: stream is never closed"如果在循环中抛出异常,则使用 try-with-resources

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:36 27 4
gpt4 key购买 nike

即使我使用 try-with-resources,为什么 Eclipse 对以下代码发出奇怪的“资源泄漏:zin 从未关闭” 警告:

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:如果我从 try block 中删除 for 循环,警告就会消失:

// 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 循环但删除包装 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:如果我在 try-with-resources 之外创建 InputStream,也没有警告:

// 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) 结果相同。

最佳答案

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

我自己也被这个问题吸引住了,并在追踪器上投了我的一票。

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

关于java - 奇怪的 "Resource leak: stream is never closed"如果在循环中抛出异常,则使用 try-with-resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23294612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com