我有这段 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 中,访问它们真的很痛苦。
答案 0 :(得分:2)
finally
块的异常。因此,来自 catch
块的异常将丢失。