Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

java 中 try catch finally 语句中同时包含 return 时的执行顺序

Java 笔记 Java 笔记


在 java 的 try ... catch ... finally 语句中,不管包含 return 语句与否,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 语句块;

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 语句块时;