【Java异常易错点】try或catch语句块中return后,finally还会执行吗?

发现问题,提出疑问

出现这个疑问是我遇到了一道题:
在这里插入图片描述
分析题目:
1、第一个输出:num为0的时候,分母为0,那么便会报出异常java.lang.ArithmeticException(这里是针对整型运算分母为0的情况,浮点型可不会抛出异常),抛出异常就执行catch语句,那么就返回 0?那这时候的finally还会执行吗?
2、针对第二个输出:num为1 的时候,在try语句块中result应该是为2的,随后又return result?那此时finally 还会执行吗?

进行测试

我们可以对这个问题进行调试,然后就知道它会不会执行finally啦。
我们先测试catch语句块中return后,finally还会执行吗?
【1】、我们在System.out.println(getNumber(0));设置断点,下一个输出1的那个位置结束,测试一下:
在这里插入图片描述
然后我们开始调试,一步一步进行下去:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出了-1,说明返回的是finally中的 return。
【2】、我们再测试一下num为1 的时候,看看try 中return后还会不会执行finally,且返回值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行了finally 中的return。

初步得出结论

即使 try或catch语句块中有return语句,finally也是会执行的,而且最后返回值取决于finally中的返回值。

理论概述

Java官方文档有下面一句话:

The finally Block
The finally block always executes when the try block exits.

当try语句块退出时,finally语句块总是会执行的。这种特性可以让程序员避免在try语句中使用了return, continue或者 break关键字而忽略了关闭相关资源的操作。把清理相关资源放到 finally 语句块中一直是最佳实践。(catch语句块也是一样的,因为catch 语句块依赖于try 嘛)
通过这题我们还可以得出结论:
1、try 中有返回值只是一种以暂存的形式存在,还得看finally有没有具体的return,如果存在那么那个暂存的将会被排除在外,以finally中的为主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假正经的小柴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值