问题标签 [autocloseable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
152 浏览

java - 在 finalize 方法中触发用户可见的异常

这个问题与finalize 方法中的 Exception和类似问题相反。

我正在创建一个AutoCloseable如果没有正确关闭会带来严重风险的课程。我希望在这种情况下进行故障排除,以免用户不小心忘记这样做。

我意识到并同意,一般的最佳实践是让Closeables 优雅地失败并尽最大努力减轻调用者的错误,但在这种情况下,调用者不想错过这一点。如果您在概念上不同意这个想法,我会很感激您的反馈,但在这种情况下,请将该问题视为关于 Java 内部的学术练习。

如果我的类的方法被调用并且实例尚未被清理,我的设想是引发IllegalStateException并中断用户。finalize()然而finalize(),明确地吞下未捕获的异常,这使得这很棘手。导致RuntimeException用户从该finalize()方法中看到的最佳方法是什么?

这是到目前为止我所拥有的演示类:

注意:我也意识到finalize()不能保证运行,所以我围绕这个方法实施的任何事情都不会发生。如果 GC 给我们机会,我仍然希望它可能发生。

0 投票
2 回答
285 浏览

java - 包装多个 AutoCloseables

tryAutoCloseable-with-resources 很好,但在我看来,在创建包装多个对象的类时,它仍然不足以进行有效的资源管理。例如,考虑

这个包装器至少有两个问题:

  1. 如果“bad-path”无效并导致分配r2抛出,r1则不关闭。
  2. 如果包装器构造成功但随后r1.close抛出,r2则不关闭。

所有这些问题都可以解决,但是编写包装器变得非常重要且容易出错,即使只包装两个资源:

是否有一些帮助类或任何其他方法可以使编写包装器更容易?

0 投票
1 回答
1968 浏览

java - 为什么在 Java 中的 try-with-resources 构造中调用资源的 close() 方法?

我碰巧意识到,情况就是这样。请参阅下面的示例:

它打印:

尝试
关闭。 终于
抓到了

问题

try-with-resources 旨在避免带有 null 检查的混乱 finally 部分,并避免资源泄漏。为什么在 catch 部分之前关闭资源?其背后的原因/想法/限制是什么?

0 投票
1 回答
533 浏览

java - AutoCloseable.close() 方法是否破坏了 Java 的向后兼容规则

从 Java 7 开始,Closeable接口已被改造为扩展AutoCloseable接口,以便所有实现Closeable接口的类都可以使用try-with-resources语句。到目前为止,Closeable 接口可以自由地抛出任何异常,包括 InterrruptedException。try-with-resources但是,在 Java 7 中,当退出 try 块后自动调用 close 方法时,语句中使用的 Closeable 接口的任何实例都可能抛出 InterruptedException,并且它InterruptedException可能会被隐式调用抑制Throwable.addSuppressed(InterruptedException);

考虑到有人可能会在不知不觉中抑制其异常并且程序没有按应有的方式运行,这是否违反了 Java 的向后兼容性规则

0 投票
5 回答
22747 浏览

java - 为什么 try-with-resources catch 块是选择性可选的?

我读到catchtry-with-resources 中的块是可选的。我尝试Connection在 try-with-resources 块中创建一个对象,没有后续catch块,只是从 eclipse 中获取编译器错误:“自动调用SQLException引发的未处理异常类型。”close()

由于可以在 try-with-resources 中使用的每个资源都实现AutoCloseable,因此在调用该方法时可能会引发异常,因此close()我不明白该catch子句如何是可选的,因为它不允许我跳过从close().

是不是有什么特殊要求,具体实现AutoCloseable不直接声明其close()方法中抛出的异常?(例如,使用不抛出任何异常 AutoCloseable的覆盖)?close() throws Exceptionclose()

..或者这可能只是一个日食问题?

编辑:这是仍然触发问题的最简单的代码片段:

关于这是否与使用 JNDI 数据源有关的想法?

提前致谢。

0 投票
3 回答
591 浏览

java - AutoCloseable的close方法抛出异常有意义吗?这应该如何处理?

C #Dispose,在IDisposable.

相比之下,在 java 中,close方法AutoCloseable允许抛出任何异常,并强制调用者以某种方式处理它。但是,如果发生这种情况,调用者合理预期会做什么?这表明关闭资源的尝试以某种方式失败。那么用户是否必须在继续之前再次尝试关闭资源,也许有某种指数退避?

0 投票
2 回答
443 浏览

java - 为什么 Java7 专门引入了 AutoCloseable?

AutoCloseable在jdk1.7中引入,Cloesable在jdk1.5中已经存在。

并根据https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

因此,Closeable实例已经可以被视为try-with-resources语句中的资源。这是肯定的,因为CloseableAutoCloseable.

我的问题是为什么java专门引入AutoCloseable,为什么不只支持Closeable,try-with-resources除了AutoCloseable还有其他使用方式try-with-resources吗?

0 投票
2 回答
1749 浏览

java - 在对象构造期间从与主体分开的 try-with-resources 中捕获错误

概括

我有一个可关闭的类型,CloseableClass它可以在其构造函数、方法甚至可能在内部抛出 IOError close。我想使用 try-with-resources 并且仍然以与使用期间的错误不同的方式处理构建期间的错误(使用包括清理)。更好的是,我想编写可维护的代码。


假设您希望构造一个可关闭的类实例并将其与 try-with-resources 语句一起使用。它可以抛出IOException它的构造函数和 try-with-resources 主体中使用的方法:

假设您要分别处理构造函数和正文中抛出的错误。有支持的方法吗?在 Python 中,我会这样做:

但在 Java 中,你不能不为对象分配第二个名称:

有人告诉我,这是“不可维护的代码”,主要是因为使用了closeable_,我离同意也不远了。我希望避免使用 try-finally ,因为那样你会遇到更糟糕的模拟它的问题:

请注意,这需要第二次调用才能close成为无操作,测试类不遵守(请注意,AutoCloseable不需要这样做,尽管Closeable确实如此)。close当不能扔时,这有点好,但不多。

基本上问题是

  • close可以扔
  • 处理前关闭IOException以防止打印"Body error!"两次
  • 如何使它与来自 try-with-resources 的多个初始化程序一起工作并不明显
  • 无论如何,您最终都会复制代码。

我只是被迫忍受“不可维护的代码”还是我忽略了处理这个问题的好方法?

0 投票
2 回答
181 浏览

java - Java 7,try-with-resources:我可以省略创建 Connection 和 PreparedStatement 吗?

案例一:

案例B:

A 的情况下con将自动关闭。案例B呢?在B 的情况下,变量不会像在A 的情况下那样创建。 psrsconps

我的问题:这两种情况完全一样吗?案例B有什么问题吗?

0 投票
3 回答
2711 浏览

java - jdk 1.7的try block中Autocloseable的新概念是什么

jdk 1.7的try block中Autocloseable的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。