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

这里有人能解开我的疑惑吗?
好像我忘记了其中的一些细节。

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

lakewent20091231 回答:Java - 捕获/重新抛出行为

  1. 是的,finally块会被执行
  2. 在这种情况下将抛出来自 finally 块的异常。因此,来自 catch 块的异常将丢失。
本文链接:https://www.f2er.com/5259.html

大家都在问