在以下 3 种特殊情况下, finally 块不会被执行:
- 在 try 或者 finally 块中用了 System.exit(int) 退出程序. 但是,如果 System,exit(int) 在异常语句之后, finally 还是会被执行; 如下:
//System.exit(0);是终止Java虚拟机JVM的
int method{
int num = 1;
try{
System.exit(0);
return num; //不允许,因为上面的语句已经把JVM停止了,那么finally自然也不运行
}finally{
//这里的语句执行不到
}
}
- 程序所在线程死亡;
- 关闭CPU;
- 停电、关机、硬件崩溃的时间刚好在运行try和finally之间的时候
补充一小点: 如果程序没运行到try-catch语句这里就返回也不会执行finally
比如:
①在运行到try语句之前,方法就有返回值return了;
② 在运行到try语句之前,方法出错了,程序就崩溃
因此: finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
//补充举个栗子
int method{
return 1; //直接返回,运行不到try语句
//下面是不可达语句
try{
}finally{
}
}
//举个李子
int test{
int num = 1/0; //出错,程序终止,运行不到try语句
//方法报异常,数学异常
try{
}finally{
}
}
- try 块: ⽤于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟⼀个 finally 块。
- catch 块: ⽤于处理 try 捕获到的异常。
- finally 块: ⽆论是否捕获或处理异常, finally 块⾥的语句都会被执⾏。当在 try 块或catch 块中遇到 return 语句时, finally 语句块将在⽅法返回之前被执⾏。