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

Elv*_*win 9 java exception finally bufferedreader

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

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()
   }
}
Run Code Online (Sandbox Code Playgroud)

ListRWLock是一个ReentrantReadWriteLock.如果reader.close()方法抛出异常,那么它之后的语句是否会无法执行?我已经尝试搜索这个主题了,虽然我已经得到了一些关于在return语句中最终执行的东西,但是我还没有设法找到如果在finally块中抛出异常会发生什么的细节.

提前致谢.

Per*_*t8S 4

基本上,finally 子句是为了确保资源的正确释放。但是,如果在finally 块内抛出异常,则该保证就会消失。

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

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

关于finally 块还需要注意一些其他事项:

  1. 当从finally块返回一个值时,我们提到的异常的相同“覆盖”问题会发生:这将覆盖try块中的代码想要返回的任何返回值。实际上,从finally子句返回值的情况很少见,也不建议这样做。
  2. 实际退出程序(通过调用 System.exit() 或导致导致进程中止的致命错误:有时在 Windows 中非正式地称为“热点”或“Watson 博士”)将阻止您的 finally 块被执行被处决!
  3. 没有什么可以阻止我们嵌套 try/catch/finally 块(例如,将 try/finally 块放在 try/catch 块内,反之亦然),而且这并不是一件不常见的事情。