try 块和 try-with-resources 语句引发的异常

Posted

技术标签:

【中文标题】try 块和 try-with-resources 语句引发的异常【英文标题】:Exception thrown from try block and try-with-resources Statement 【发布时间】:2017-04-16 12:27:23 【问题描述】:

考虑 Java Docs 中的以下代码。

static String readFirstLineFromFile(String path) throws IOException 
    try (**BufferedReader br = new BufferedReader(new FileReader(path))**) 
        **return br.readLine();**
    

根据 Java 文档

在示例 readFirstLineFromFile 中,如果从 try 块和 try-with-resources 语句,然后 方法 readFirstLineFromFile 抛出 try 抛出的异常 堵塞; try-with-resources 块抛出的异常是 被压制了。

另一方面,也提到了

因为 BufferedReader 实例是在 try-with-resource 中声明的 语句,不管是否有try语句都会关闭 正常或突然完成(作为方法的结果 BufferedReader.readLine 抛出 IOException)。

(也就是说close方法只有在try块执行完之后才会调用……据我的理解)

所以,假设 try-with-resources 语句和 try 块都抛出异常,并考虑抛出异常的顺序

1)首先从tryreturn br.readLine();抛出异常

2) 然后一旦try块完成(不管try块是否抛出异常),调用Buffered Reader的close方法,然后它也抛出@ 987654325@.

所以,理想情况下,从方法 readFirstLineFromFile 抛出的异常应该是来自 BufferedReader 的 close 方法的异常(因为它是最后执行的),而不是来自 try 块内的 return br.readLine(); 的异常(与之前提到的相比)在 Javadocs 中)

有人可以澄清我的疑问吗?

【问题讨论】:

我不明白为什么这是理想的。我更喜欢由 try 块抛出的功能异常,而不是由 close() 方法抛出的我无能为力的技术异常。如果异常是 IOException,例如,因为文件已被删除,我更希望异常告诉我无法从文件中读取,而不是异常告诉我无法关闭阅读器(这也是文件删除引起的)。 【参考方案1】:

您会假设 try(<<stuff>>)stuff.dude(); 类似于 trystuff.dude();finallystuff.close();

所以无论成功或失败,它都会关闭可关闭的(如果适用)

【讨论】:

以上是关于try 块和 try-with-resources 语句引发的异常的主要内容,如果未能解决你的问题,请参考以下文章

try-with-resources 语法简介

Try-with-resource'必须是变量声明'[重复]

在 Netbeans 中使用 try-with-resources

try-with-resources 失败但尝试有效

try-with-resources

第9项:尽量使用try-with-resources而不是try-finally(Prefer try-with-resources to try-finally)