try块和try-with-resources语句

时间:2017-04-16 12:27:23

标签: java exception-handling

考虑来自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)。

(这意味着只有在执行try块后才调用close方法......根据我的理解)

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

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

引发

2)然后,一旦try块完成(无论是否从try块抛出异常),都会调用Buffered Reader的close方法,然后它也会被调用抛出exception

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

有人可以澄清我的疑问。

1 个答案:

答案 0 :(得分:0)

您认为try(<<stuff>>){stuff.dude();}类似于try{stuff.dude();}finally{stuff.close();}

成功或失败时,如果适用,它会关闭可关闭的