【问题标题】:Exception thrown from try block and try-with-resources Statementtry 块和 try-with-resources 语句引发的异常
【发布时间】: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,例如,因为文件已被删除,我更希望异常告诉我无法从文件中读取,而不是异常告诉我无法关闭阅读器(这也是文件删除引起的)。

标签: java exception-handling


【解决方案1】:

您会假设 try(<<stuff>>){stuff.dude();} 类似于 try{stuff.dude();}finally{stuff.close();}

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

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多