Mer*_*Mer 27 java try-with-resources autocloseable
我读到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()
不抛出任何异常)?
..或者这可能只是一个日食问题?
编辑:这是仍然触发问题的最简单的代码片段:
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
是一个经过检查的异常.