出现这个疑问是我遇到了一道题:
分析题目:
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中的为主。