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)首先从try
块return 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-resource'必须是变量声明'[重复]
在 Netbeans 中使用 try-with-resources
第9项:尽量使用try-with-resources而不是try-finally(Prefer try-with-resources to try-finally)