为什么尽管我使用了try-with-resources
,Eclipse仍然会对以下代码发出奇怪的“resource leak: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
块中删除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中的一个已知bug:[compiler][resource]while循环返回时出现的错误资源泄漏问题(资源在finally块中传递)。
我自己也被它咬了一口,我已经在跟踪器上投了一票。
更新:上述bug已在4.5M7中解决。这将包含在Eclipse4.5(“Mars”)的最终版本中--该版本预计将于2015-06-24发布。
主要内容:Java SE 7:Try-With-Resources基础知识,Java SE 7:Try-With-Resources规则,Java SE 9:Try-With-Resources改进在这篇文章中,我们将讨论Java SE 9中的一些改进语句。现在让我们开始学习这个构造。 Java SE 7:Try-With-Resources基础知识 Java SE 7引入了一个新的构造: 语句,用于更好的异常处理。 如果没有这个构造,开发人员必须编写大量冗余和难看的代码。 如果开发人员忘记正确
我在Quarkus REST应用程序中有几个接受ID的调用。 我使用活动记录模式来处理数据库请求。来自Spring的将在结果集为空时抛出异常。我将使用捕获此异常,并抛出相应的响应代码(在本例中为404)。这也适用于所有其他例外情况。 有没有办法将Panache/Hibernate配置为在空结果集上抛出异常?现在,我必须手动检查结果是否为空/空,然后抛出相应的异常。 例如,这就是我现在要做的: 当我
我在我的android应用程序中使用增强for循环来迭代状态对象列表。 这将生成以下IndexOutOfBoundsException:java。lang.IndexOutOfBoundsException:索引0无效,大小为0 我意识到这是因为ArrayList的大小是0,这意味着它是空的。我的问题是,为什么它一开始就进入了循环,而不是为了保证这些问题不会发生而创建的增强for,以及如何阻止它。
本文向大家介绍如何在JDBC中使用try-with-resources?,包括了如何在JDBC中使用try-with-resources?的使用技巧和注意事项,需要的朋友参考一下 每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。 通常,我们使用finally资源使用close资源作为- 从JSE7开始,引入了try-with-resources语句。在这种情况下,我
我读到了JDK7中的试用资源,当我考虑升级应用程序以使用JDK7运行时,我遇到了这个问题。 作为示例,我创建了一个自动关闭资源: 现在使用时: 我如何区分这样的异常,而不必为类(如BufferedReader)创建包装器?
下面的try with resources语句是来自Java文档的示例 根据文件, 用资源尝试语句确保每个资源在语句末尾关闭。 我的问题是,为什么我需要在try关键字之后立即在括号内声明资源。(如上面的BuffereReader) BufferReader实现了java。lang.AutoCloseable 所以为什么不支持这样的事情, 一旦退出尝试,就隐式关闭资源对象。(正如它所实现的自动关闭)