【问题标题】:Does finally completely execute if an exception is thrown within finally block如果 finally 块中抛出异常,最终是否完全执行
【发布时间】:2014-11-22 18:40:34
【问题描述】:

所以我这里有一些代码,我不确定如果 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()
   }
}

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

提前致谢。

【问题讨论】:

  • 后面的语句不应该执行。此外,finally 块中的 return 可以覆盖以前的异常。

标签: java exception bufferedreader finally


【解决方案1】:

你应该测试一下,

但是如果尝试抛出 IO 异常,那么您的阅读器将不会关闭。

也许有

catch(IOException ex){ 
         reader.close()

【讨论】:

    【解决方案2】:

    异常可能发生在代码中的任何位置,包括finally 块,因此您必须像在代码中的任何其他位置一样捕获它。查看以下帖子以了解有关如何处理此类情况的一些想法:

    throws Exception in finally blocks

    【讨论】:

    • 不回答问题。
    【解决方案3】:

    基本上,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
        }
      }
    }
    

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

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

    【讨论】:

    • 您直接从herehere 复制并混合了您的答案?从他们每个人那里取一句话!有礼貌至少给他们荣誉!
    【解决方案4】:

    你可以这样做:

    try{
        //miscellaneous code involving reading
    }finally{
       handlePossibleException(reader);
       listRWLock.readLock().unlock()
    }
    
    handlePossibleException(BufferedReader reader) {
        try {
             if (reader != null) {
                 reader.close();
             }
        } catch( Exception e ) {
          log.e( "reader.close() Exception: ", e );
          }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2010-10-24
      • 2013-02-23
      • 2010-10-03
      • 2010-12-06
      • 2011-02-24
      相关资源
      最近更新 更多