【Java】finally 语句块不被执行的几种情况

在这里插入图片描述

执行顺序

try {
    
      
    doSomething();  
    return success;  
} catch (Exception e) {
    
       
    return failure;  
} finally {
    
      
    System.out.println("this finally block always print out");
}

上述示例的语句执行顺序如下:

  1. 执行 try 语句块,如果未出现异常,则在执行 return 语句之前,执行 finally 语句块;
  2. 在运行 try 语句块时,若报错误,则跳入 catch 语句块中,然后在执行 catch 语句块中的 return 语句之前,执行 finally 语句块;

2.finally 语句块不被执行的几种情况

finally 语句块在 try 和 catch 语句块执行后,总是被执行,但是有如下几种情况下例外:

  1. 如果提前执行了 System.exit()
  2. 如果提前执行了 Runtime.getRuntime().halt(exitStatus)
  3. 若 JVM 提前崩溃了;
  4. 若在 try 或 catch 语句块中出现无限循环;
  5. 若系统强制停止了 JVM 进程,如在类 Unix 系统上执行了 kill -9 <pid>
  6. 若进程宿主机挂了,如断电了、硬件出现错误等等;
  7. 如果 finally 语句块准备被后台线程(daemon thread)调用,且没有其他非后台线程(non-daemon threads)可调用 finally 语句块时;

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/108857749