问题标签 [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.
java - 在 finalize 方法中触发用户可见的异常
这个问题与finalize 方法中的 Exception和类似问题相反。
我正在创建一个AutoCloseable
如果没有正确关闭会带来严重风险的课程。我希望在这种情况下进行故障排除,以免用户不小心忘记这样做。
我意识到并同意,一般的最佳实践是让Closeable
s 优雅地失败并尽最大努力减轻调用者的错误,但在这种情况下,调用者不想错过这一点。如果您在概念上不同意这个想法,我会很感激您的反馈,但在这种情况下,请将该问题视为关于 Java 内部的学术练习。
如果我的类的方法被调用并且实例尚未被清理,我的设想是引发IllegalStateException
并中断用户。finalize()
然而finalize()
,明确地吞下未捕获的异常,这使得这很棘手。导致RuntimeException
用户从该finalize()
方法中看到的最佳方法是什么?
这是到目前为止我所拥有的演示类:
注意:我也意识到finalize()
不能保证运行,所以我围绕这个方法实施的任何事情都不会发生。如果 GC 给我们机会,我仍然希望它可能发生。
java - 包装多个 AutoCloseables
try
AutoCloseable
-with-resources 很好,但在我看来,在创建包装多个对象的类时,它仍然不足以进行有效的资源管理。例如,考虑
这个包装器至少有两个问题:
- 如果“bad-path”无效并导致分配
r2
抛出,r1
则不关闭。 - 如果包装器构造成功但随后
r1.close
抛出,r2
则不关闭。
所有这些问题都可以解决,但是编写包装器变得非常重要且容易出错,即使只包装两个资源:
是否有一些帮助类或任何其他方法可以使编写包装器更容易?
java - 为什么在 Java 中的 try-with-resources 构造中调用资源的 close() 方法?
我碰巧意识到,情况就是这样。请参阅下面的示例:
它打印:
尝试
关闭。 终于
抓到了
问题
try-with-resources 旨在避免带有 null 检查的混乱 finally 部分,并避免资源泄漏。为什么在 catch 部分之前关闭资源?其背后的原因/想法/限制是什么?
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 的向后兼容性规则
java - 为什么 try-with-resources catch 块是选择性可选的?
我读到catch
try-with-resources 中的块是可选的。我尝试Connection
在 try-with-resources 块中创建一个对象,没有后续catch
块,只是从 eclipse 中获取编译器错误:“自动调用SQLException
引发的未处理异常类型。”close()
由于可以在 try-with-resources 中使用的每个资源都实现AutoCloseable
,因此在调用该方法时可能会引发异常,因此close()
我不明白该catch
子句如何是可选的,因为它不允许我跳过从close()
.
是不是有什么特殊要求,具体实现AutoCloseable
不直接声明其close()
方法中抛出的异常?(例如,使用不抛出任何异常 AutoCloseable
的覆盖)?close() throws Exception
close()
..或者这可能只是一个日食问题?
编辑:这是仍然触发问题的最简单的代码片段:
关于这是否与使用 JNDI 数据源有关的想法?
提前致谢。
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
语句中的资源。这是肯定的,因为Closeable
从AutoCloseable
.
我的问题是为什么java专门引入AutoCloseable
,为什么不只支持Closeable,try-with-resources
除了AutoCloseable还有其他使用方式try-with-resources
吗?
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 的多个初始化程序一起工作并不明显
- 无论如何,您最终都会复制代码。
我只是被迫忍受“不可维护的代码”还是我忽略了处理这个问题的好方法?
java - Java 7,try-with-resources:我可以省略创建 Connection 和 PreparedStatement 吗?
案例一:
案例B:
在A 的情况下 ,con
将自动关闭。案例B呢?在B 的情况下,变量不会像在A 的情况下那样创建。 ps
rs
con
ps
我的问题:这两种情况完全一样吗?案例B有什么问题吗?
java - jdk 1.7的try block中Autocloseable的新概念是什么
jdk 1.7的try block中Autocloseable的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。