当前位置: 首页 > 知识库问答 >
问题:

为什么try with resources catch block是选择性的?

顾磊
2023-03-14

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

由于每一个资源,可以使用在try与资源实现AutoCloseable,因此潜在地抛出一个异常调用关闭()方法,我不明白如何cat子句是可选的,因为它不允许我跳过从关闭()捕获异常。

是否有一些特殊要求,即AutoCloseable的具体实现不直接声明其方法中抛出的任何异常?(例如,overrideAutoCloseable'sclose()抛出异常,而close()不抛出任何异常)?

..或者这可能只是日蚀问题?

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

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

}

关于这是否与使用JNDI DataSource有关的想法?

提前谢谢。


共有3个答案

况鸿雪
2023-03-14

您可以检查JLS,但实际上有一个相对简单的推理,为什么这是该语言唯一正确的行为方式。

检查异常的主要规则是必须处理方法声明的任何检查异常,要么通过捕获它,要么让调用方法抛出它。

try资源总是(隐式)调用关闭方法。

因此,如果您使用的AutoClosable的特定close方法(由try中声明的类型决定)声明抛出选中的异常,例如SQLException,那么您确实需要在某处处理该选中的异常,否则可能会违反规则!

如果关闭方法没有声明它抛出检查异常,则不违反规则,并且您不需要处理隐式调用关闭方法的检查异常。如果您确实尝试捕获从未声明要抛出的检查异常,这实际上是编译失败。

王泓
2023-03-14

您可能只是抛出异常(或在另一个try-catch块中捕获):

private static void test() throws IOException {
    try(InputStream is = new FileInputStream("test.txt")) {
        while(is.read() > -1) {
        }
    } finally {
        // Will get executed, even if exception occurs
        System.out.println("Finished");
    }
}
章海
2023-03-14

如果over()无法抛出已检查的异常,则该选项是可选的。但是,如果over()可以,则需要以正常方式处理已检查的异常,可以使用cat块,也可以从try-with-Resources块所在的方法中抛出。

更多详细信息请参见JLS 14.2.3

14.20.3.2. 扩展资源试用

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

扩展的try with资源语句的含义:

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 DataSource有关的想法?

是的,它是。

在您提供的示例try with resources块中,有必要捕获异常并处理,或者从块所在的方法中抛出,因为SQLException是一个选中的异常。

 类似资料:
  • 目前正在使用React Native,并尝试使用React Native nfc ios和React national nfc,以便我可以在ios和Android之间进行跨设备通信。我发现他们无法沟通,但我认为这是由于一个更广泛的问题(因为其他现有的应用程序也无法工作)。 如果我在iPhone7上下载NFC阅读器应用程序,在Android上下载NFC写入器应用程序,它们就无法通信。这是为什么呢?

  • 如果你曾经使用过构建工具,你可能会对遇到的问题感到很沮丧,构建工具不是应该自动帮你完成项目的构建吗?你不得不向性能、扩展性等妥协。 比如你在构建一个项目的发布版本时,你要把一个文件拷贝到指定的位置,你在项目的元数据那里添加了版本的描述,如果版本号匹配一个特定的数字时,就把文件从A拷贝到B处。如果你依赖XML来构建,你要实现这个任务就像噩梦一样,你只能通过非标准的机制来添加一些脚本到构建中,结果就是

  • 来源:https://github.com/atom-china/manual 这个世界上有那么多种编辑器,为什么你要花时间学习和使用 Atom 呢? 虽然 Sublime 和 TextMate 之类的编辑器已经非常好用了,但它们仅提供了很有限的拓展性。而在另一个极端,Emacs 和 Vim 提供了灵活的拓展性,但它们并不是很友好,需要使用专用的编程语言来配置和拓展。 我们觉得我们可以做得更好。我

  • 为什么选择 NuxtJS

  • Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型. 作为负载均衡服务器:Ngin

  • 虽然市场上有几十种不同的版本控制系统,一些世界上最著名的项目(例如 Linux 内核, Ruby on Rails,或是jQuery)都选择了使用 Git 作为它们的版本控制系统。为什么它们都选择 Git 呢? 节省时间 Git 运行快速。尽管我们在这里讨论的只是运行一个命令所需要的几秒钟,但是把它累积在你的日常工作中就是一个不小的飞跃了。它可以节省那些不必要的等待时间,并且去完成其它一些有意义的