gpt4 book ai didi

java - 如果在 finally block 中抛出异常,是否最终完全执行

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:18 25 4
gpt4 key购买 nike

所以我这里有一些代码,但我不确定在 reader.close() 方法抛出异常时它会如何 react 。

public void someMethod(String s) throws IOException{
BufferedReader reader = Files.newBufferedReader(filePath,cs);
listRWLock.readLock().lock();
try{
//miscellaneous code involving reading
}finally{
reader.close()
listRWLock.readLock().unlock()
}
}

ListRWLock 是一个 ReentrantReadWriteLock。如果reader.close()方法抛出异常,它后面的语句会不会执行失败?我已经尝试搜索该主题,虽然我得到了一些关于在 return 语句的情况下最终执行的信息,但我还没有设法找到有关如果在 finally block 中抛出异常会发生什么情况的详细信息。

提前致谢。

最佳答案

基本上,finally 子句用于确保正确释放资源。但是,如果在 finally block 内抛出异常,则该保证将消失。

一个没有真正完美解决方案的问题是 finally block 中的代码本身可能会引发异常。在这种情况下,finally block 中的异常将从异常中抛出,而不是 try block 内发生的任何异常。由于 finally block 中的代码旨在成为“清理”代码,我们可以决定将那里发生的异常视为次要的,并放置一个明确的捕获:

public int readNumber(File f) throws IOException, NumberFormatException {
BufferedReader br = new BufferedReader(new
InputStreamReader(new FileInputStream(f), "ASCII"));
try {
return Integer.parseInt(br.readLine());
} finally {
try { br.close(); } catch (IOException e) {
// possibly log e
}
}
}

关于 finally block 的其他一些注意事项:

  1. 我们在异常(exception)情况下提到的相同“压倒一切”的问题从 finally block 返回值时发生:这将覆盖 try block 中的代码想要的任何返回值返回。实际上,从 finally 子句返回一个值是很少见的不推荐。
  2. 实际退出程序(通过调用 System.exit() 或通过导致导致进程中止的 fatal error :有时在 Windows 中非正式地称为“热点”或“Dr Watson”)将阻止您的 finally block 被执行!
  3. 没有什么可以阻止我们嵌套 try/catch/finally block (因为例如,将 try/finally block 放在 try/catch block 中,或者反之亦然),这并不少见。

关于java - 如果在 finally block 中抛出异常,是否最终完全执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26081809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com