【发布时间】: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。
-
如果 catch 块像这里所做的那样重新抛出异常,finally 块会被执行吗?
如果我没记错,即使在这种情况下,finally 块也会被执行。 -
好吧,如果是这样的话……如果我们进入 catch 块(它重新抛出),然后我们进入 finally 块,并且 finally 块也在这一行
writer.close();处抛出 RuntimeException 会发生什么?整个方法会抛出哪个异常——从 catch 块中重新抛出一个异常,还是从 finally 块中抛出 RuntimeException?!
我认为RuntimeException将是该方法的最终结果,我们永远不会到达重新抛出的 catch 块中的行。因为我猜想重新抛出的行是在 finally 块之后执行的。但我不确定。我真的很困惑。
有人可以在这里解决我的疑问吗?
好像我忘记了其中一些细节。
而且我无法正常访问日志,它们位于 Elastic/Kibana 中,访问它们真的很痛苦。
【问题讨论】: