当前位置: 首页 > 面试题库 >

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

巫英纵
2023-03-14
问题内容

我读到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数据源的使用有关的思考?

提前致谢。


问题答案:

如果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是一个已检查的异常。



 类似资料:
  • 我读到try-with资源中的块是可选的。我尝试在try-with资源块中创建一个对象,没有后续的块,只是从eclipse中获取编译器错误:“由自动调用引发的未处理异常类型。” 由于每一个资源,可以使用在try与资源实现,因此潜在地抛出一个异常调用方法,我不明白如何子句是可选的,因为它不允许我跳过从捕获异常。 是否有一些特殊要求,即AutoCloseable的具体实现不直接声明其方法中抛出的任何异

  • 本文向大家介绍什么是Java中的try-with-resource?,包括了什么是Java中的try-with-resource?的使用技巧和注意事项,需要的朋友参考一下 每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。 从JSE7开始,引入了try-with-resources语句。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在

  • 问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选

  • 下面的try with resources语句是来自Java文档的示例 根据文件, 用资源尝试语句确保每个资源在语句末尾关闭。 我的问题是,为什么我需要在try关键字之后立即在括号内声明资源。(如上面的BuffereReader) BufferReader实现了java。lang.AutoCloseable 所以为什么不支持这样的事情, 一旦退出尝试,就隐式关闭资源对象。(正如它所实现的自动关闭)

  • 问题内容: 在下面的Java程序中,即使成员“ x”在try块之外定义,也可以在try块内部访问它。如果是“ y”,则在try块内定义。但是在try块之外无法访问它。为什么会这样呢? 输出为: 问题答案: 任何块都定义Java中的作用域。因此,在try块内声明的任何变量(例如)都只能在try块内访问。 在包含try块的外部块(即整个方法的块)中声明,因此可以在try块内部访问它。

  • 问题内容: Java7的try-with-resources非常好,但是我无法绕开为什么需要在语句中包括资源声明的问题。我的直觉说以下应该是可能的: las,这会导致语法错误(含糊地期待a )。将类型定义/声明移动到语句中是可行的,这当然会将事物移动到相应的范围内。当我想从封闭中获得更多收益时,我可以弄清楚该如何解决,我对 为什么 编译器需要这样的东西很感兴趣。 问题答案: 您的版本未明确定义应关