2017-04-16 40 views
0

考虑Java Docs中的以下代码。从try块和try-with-resources引发的异常声明

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

按Java文档

在readFirstLineFromFile,如果异常是从 try块和尝试,以资源的语句都抛出,那么 方法readFirstLineFromFile抛出的例子从try 块中抛出的异常;从try-with-resources块抛出的异常被取消了 。

在另一方面,由于BufferedReader类实例在try-与资源 声明中宣布它也提到

,将无论try语句 是否正常完成关闭或突然(由于方法
BufferedReader.readLine抛出一个IOException)。

(这意味着在执行try块后,才调用close方法......按我的理解)

因此,假设这两个尝试,与资源声明,try块抛出异常并考虑在其中引发异常

1)异常首先从try块抛出的顺序return br.readLine();

2)然后只要try块完成(不管是否从try块抛出异常),将调用Buffered Reader的close方法,然后它会抛出exception

所以,最好从方法readFirstLineFromFile抛出的异常应该从BufferedReader中的Close方法(因为它是最后被执行)的一个,而不是try块中的一个从return br.readLine();(相比于已经内部Javadoc中提及)

有人可以澄清我的疑问。

+0

我不明白为什么这会是理想的封闭。我更喜欢获得try块引发的功能异常,而不是技术例外,我无法做任何事情,由close()方法抛出。如果异常是一个IOException,因为例如文件已被删除,我宁愿有一个异常告诉我从文件中读取是不可能的,而不是一个例外,告诉我读者不能关闭(并且这也是由文件删除引起的)。 –

回答

0

你会假设try(<<stuff>>){stuff.dude();}就像try{stuff.dude();}finally{stuff.close();}

因此成功或失败,它关闭如果适用