首页 > 解决方案 > Java - 捕获/重新抛出行为

问题描述

我有这段Java代码。

void convertFile() { 

        try{
            ..... 
        }catch (Exception e) {
            logError("Error in convertJsonFile", e);
            throw e;
        }finally{
            
            if (writer!=null) {
                writer.close();
                writer = null;
            }
            if (fos!=null) {
                fos.close();
                fos = null;
            }
            
            ms2 = System.currentTimeMillis();

            logInfo(String.format("Time elapsed: %d seconds.", ((ms2-ms1)/1000)));
            logInfo("File conversion complete.");
            
        }
        
        return f + "_changed.xml";
} 

catch 块记录并重新抛出异常。
但似乎 finally 块也抛出了一个 RuntimeException。

  1. 如果 catch 块像这里所做的那样重新抛出异常,finally 块会被执行吗?
    如果我没记错,即使在这种情况下,finally 块也会被执行。

  2. 好吧,如果是这样...如果我们进入 catch 块(它重新抛出),然后我们进入 finally 块,并且 finally 块也在这一行抛出 RuntimeException 会发生writer.close(); 什么?整个方法会抛出哪个异常——从 catch 块中重新抛出一个异常,还是从 finally 块中抛出 RuntimeException?!
    我认为这RuntimeException将是该方法的最终结果,我们永远不会到达重新抛出的 catch 块中的行。因为我猜想重新抛出的行是在 finally 块之后执行的。但我不确定。我真的很困惑。

有人可以在这里消除我的疑问吗?
似乎我忘记了其中一些细节。

而且我无法正常访问日志,它们位于 Elastic/Kibana 中,访问它们真的很痛苦。

标签: javajava-8

解决方案


  1. 是的,finally 块将被执行
  2. finally在这种情况下,将抛出块异常。因此,catch块中的异常将丢失。

推荐阅读