Java中finally代码块的内容是否一定执行呢?
在Java开发过程中我们了解到,finally代码块的内容在执行到最后的话一定会被执行到吗?答案是不一定,可能会有小伙伴心生疑问,肯定会被执行啊,既然能这么回答,说明肯定存在一些特殊的情况下,finally是不会被执行滴。
文章目录
1.正常情况下finally使用
1.1 无异常的finally
public static void testNormalTry() {
try {
// TO NOTHING
// 执行具体业务逻辑
} finally {
System.out.println("进入finally代码块了");
}
// 如上代码执行,必定会进入finally中,进而输出语句
}
- 运行结果
1.2 存在异常的finally
/**
* 异常下的finally代码块能否执行?
*/
public static void testNormalTry() {
try {
// TO NOTHING
int num = 10 / 0;
// 执行具体业务逻辑
} finally {
System.out.println("进入finally代码块了");
}
}
- 执行结果
1.3 小结
上述代码类似于我们日常开发中的使用场景,上述是我们理想状态下想要达到的效果,但是实际上我们可能因为理解的偏差就可能导致finally语句块失效。
2.finally语句块失效?
2.1 不在try语句内的finally
假如不在try语句内的finally发生了异常,finally语句块的代码是否被执行呢?
public static void testFinally() {
// 模拟运行时业务执行异常,ArithmeticException
int num = 10 / 0;
try {
// TO NOTHING
// 执行具体业务逻辑
} finally {
System.out.println("finally......");
}
}
- 运行结果
异常抛出了,但是finally代码块的内容为什么没有输出呢?答案是由于脱离了try语句的范围时,如果执行异常,finally代码块的内容一定不会被执行。
2.2 使程序正常的退出
代码 | 概述 |
---|---|
System.exit(int status) | 是用来结束当前正在运行中的java虚拟机 |
System.exit(0) | status 是 0 ,那么表示正常退出程序 |
System.exit(1) | status 是1或者非零参数,那么表示非正常退出程序 |
public static void testFinally() {
try {
// TO NOTHING
// 执行具体业务逻辑
// 手动调用exit方法 使得成功正常退出
System.exit(0);
} finally {
System.out.println("finally......");
}
}
- 执行结果
System.exit(status)命令相当于结束当前运行中的虚拟机,此时finally代码块也不会执行。 即就是如果混入业务中时,就可能导致finally代码块不会被执行。
3.小结建议
- 1、try…finally…代码块,一定要将业务异常包裹在try语句内。
- 2、慎用System.exit代码。
综上所述,是我对finally失效两种情况的总结,如有错误,欢迎大家校正,谢谢