一尘不染

finally 块是否总是在 Java 中执行?

javascript

考虑到这段代码,我是否可以绝对确定finally块始终执行,无论something()是什么?

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("I don't know if this will get printed out");
}

阅读 207

收藏
2022-02-06

共1个答案

一尘不染

是的,finally将在trycatch代码块执行后调用。

唯一finally不会被调用的时间是:

  1. 如果你调用 System.exit()
  2. 如果你调用 Runtime.getRuntime().halt(exitStatus)
  3. 如果 JVM 先崩溃
  4. try如果 JVM 在orcatch块中到达无限循环(或一些其他不可中断、非终止的语句)
  5. 如果操作系统强行终止JVM进程;例如,kill -9 <pid>在 UNIX 上
  6. 如果主机系统死机;例如,电源故障、硬件错误、操作系统恐慌等
  7. 如果该finally块将由守护线程执行并且所有其他非守护线程在finally被调用之前退出
2022-02-06