我读到catchtry-with-resources 中的块是可选的。我试图Connection在try-with- resources块中创建一个对象,没有后续catch块,只是从eclipse中获取编译器错误:“ SQLException自动close()调用引发了未处理的异常类型。”
catch
Connection
SQLException
close()
由于可以在try-with- resources中使用的每个资源都实现了AutoCloseable,因此在调用该close()方法时可能会引发异常,因此我不明白该catch子句是可选的,因为它不允许我跳过从中捕获异常的过程。close()。
AutoCloseable
是否有一些特殊要求,即AutoCloseable不直接声明在其close()方法中引发任何异常的特定实现?(如覆盖AutoCloseable的close() throws Exception一个close()不抛出任何异常)?
close() throws Exception
..或者这可能只是一个月食问题?
编辑:这是仍然触发问题的最简单的代码片段:
try (Connection con = dataSource.getConnection()) { /*...*/ }
关于这是否与JNDI数据源的使用有关的思考?
提前致谢。
如果close()不能抛出已检查的异常,则是可选的。但是,如果close()可以的话,则需要使用一个catch块或通过从该try-with- resources块所在的方法中抛出该异常,以一种常规方式来处理一个检查的异常。
try-with- resources
更多细节在JLS 14.2.3中
14.20.3.2。扩展的尝试资源 带有至少一个catch子句和/或finally子句的try-with-resources语句称为扩展try-with-resources语句。 扩展try-with-resources语句的含义:
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块时,所有资源都将被关闭(或尝试关闭)。
转换的结果是将资源规范“放在” try语句内。这允许扩展try-with- resources语句的catch子句捕获由于自动初始化或关闭任何资源而导致的异常。
此外,与finally关键字的意图保持一致,到执行finally块时,所有资源都将被关闭(或尝试关闭)。
是的。
在您提供的示例 try-with-resourses 块中,有必要捕获异常并对其进行处理,或者从该块所在的方法中抛出该异常,因为这SQLException是一个已检查的异常。