为什么try-with-resources catch块选择性地可选?

Mer*_*Mer 27 java try-with-resources autocloseable

我读到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()) {
  /*...*/

}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

jdp*_*nix 22

如果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]
Run Code Online (Sandbox Code Playgroud)

通过以下转换给出嵌套在try-catch或try-finally或try-catch-finally语句中的基本try-with-resources语句:

try {
    try ResourceSpecification
       Block
}
[Catches]
[Finally]
Run Code Online (Sandbox Code Playgroud)

翻译的效果是将资源规范放在try语句的"内部".这允许扩展的try-with-resources语句的catch子句捕获由于自动初始化或关闭任何资源而导致的异常.

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

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

是的.

在您提供的try-with-resourses块示例中,必须捕获异常并处理,或者从块所在的方法中抛出,因为它SQLException是一个经过检查的异常.