一尘不染

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

java

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

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

是否有一些特殊要求,即AutoCloseable不直接声明在其close()方法中引发任何异常的特定实现?(如覆盖AutoCloseableclose() throws Exception一个close()不抛出任何异常)?

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

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

try (Connection con = dataSource.getConnection()) {
  /*...*/

}

关于这是否与JNDI数据源的使用有关的思考?

提前致谢。


阅读 277

收藏
2020-12-03

共1个答案

一尘不染

如果close()不能抛出已检查的异常,则是可选的。但是,如果close()可以的话,则需要使用一个catch块或通过从该try-with- resources块所在的方法中抛出该异常,以一种常规方式来处理一个检查的异常。

更多细节在JLS
14.2.3中

14.20.3.2。扩展的尝试资源

带有至少一个catch子句和/或finally子句的try-with-resources语句称为扩展try-with-resources语句。

扩展try-with-resources语句的含义:

try ResourceSpecification
    Block
[Catches]
[Finally]

由以下翻译提供给嵌套在try-catch或try-finally或try-catch-finally语句内的基本try-with-
resources语句:

try {
    try ResourceSpecification
       Block
}
[Catches]
[Finally]

转换的结果是将资源规范“放在” try语句内。这允许扩展try-with-
resources语句的catch子句捕获由于自动初始化或关闭任何资源而导致的异常。

此外,与finally关键字的意图保持一致,到执行finally块时,所有资源都将被关闭(或尝试关闭)。

关于这是否与JNDI数据源的使用有关的思考?

是的。

在您提供的示例 try-with-resourses
块中,有必要捕获异常并对其进行处理,或者从该块所在的方法中抛出该异常,因为这SQLException是一个已检查的异常。

2020-12-03