【问题标题】:Java - catch/rethrow behavior [duplicate]Java - 捕获/重新抛出行为
【发布时间】:2021-07-31 13:24:35
【问题描述】:

我有这段 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 块也在这一行 writer.close(); 处抛出 RuntimeException 会发生什么?整个方法会抛出哪个异常——从 catch 块中重新抛出一个异常,还是从 finally 块中抛出 RuntimeException?!
    我认为RuntimeException 将是该方法的最终结果,我们永远不会到达重新抛出的 catch 块中的行。因为我猜想重新抛出的行是在 finally 块之后执行的。但我不确定。我真的很困惑。

有人可以在这里解决我的疑问吗?
好像我忘记了其中一些细节。

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

【问题讨论】:

    标签: java java-8


    【解决方案1】:
    1. 是的,finally 块将被执行
    2. 在这种情况下将抛出来自finally 块的异常。因此,来自catch 块的异常将丢失。

    【讨论】:

    • 这称为异常屏蔽。可以添加资源尝试确保不会发生屏蔽。
    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2012-03-25
    • 2021-04-01
    • 2014-08-18
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多