在 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");
}
上述示例的语句执行顺序如下:
- 执行 try 语句块,如果未出现异常,则在执行 return 语句之前,执行 finally 语句块;
- 在运行 try 语句块时,若报错误,则跳入 catch 语句块中,然后在执行 catch 语句块中的 return 语句之前,执行 finally 语句块;
finally 语句块不被执行的几种情况
finally 语句块在 try 和 catch 语句块执行后,总是被执行,但是有如下几种情况下例外:
- 如果提前执行了
System.exit()
; - 如果提前执行了
Runtime.getRuntime().halt(exitStatus)
; - 若 JVM 提前崩溃了;
- 若在 try 或 catch 语句块中出现无限循环;
- 若系统强制停止了 JVM 进程,如在类 Unix 系统上执行了
kill -9 <pid>
; - 若进程宿主机挂了,如断电了、硬件出现错误等等;
- 如果 finally 语句块准备被后台线程(daemon thread)调用,且没有其他非后台线程(non-daemon threads)可调用 finally 语句块时;