Java中finally代码块的内容是否一定执行呢?

Java中finally代码块的内容是否一定执行呢?

在Java开发过程中我们了解到,finally代码块的内容在执行到最后的话一定会被执行到吗?答案是不一定,可能会有小伙伴心生疑问,肯定会被执行啊,既然能这么回答,说明肯定存在一些特殊的情况下,finally是不会被执行滴。

1.正常情况下finally使用

1.1 无异常的finally
public static void testNormalTry() {
        try {
            // TO NOTHING
            // 执行具体业务逻辑
        } finally {
            System.out.println("进入finally代码块了");
        }
		// 如上代码执行,必定会进入finally中,进而输出语句
    }
  • 运行结果
    无异常的finally代码块
1.2 存在异常的finally
/**
  * 异常下的finally代码块能否执行?
  */
    public static void testNormalTry() {
        try {
            // TO NOTHING
            int num = 10 / 0;
            // 执行具体业务逻辑
        } finally {
            System.out.println("进入finally代码块了");
        }
    }
  • 执行结果
    存在异常时的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语句内容没有输出

异常抛出了,但是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......");
        }
    }
  • 执行结果
    exit命令退出执行

System.exit(status)命令相当于结束当前运行中的虚拟机,此时finally代码块也不会执行。 即就是如果混入业务中时,就可能导致finally代码块不会被执行。

3.小结建议

  • 1、try…finally…代码块,一定要将业务异常包裹在try语句内。
  • 2、慎用System.exit代码。

综上所述,是我对finally失效两种情况的总结,如有错误,欢迎大家校正,谢谢
乌拉拉噻

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值