00015.02 finally与return混用

前言

finally下的代码 是一定会执行的

一、finally与return的纠缠不清

00015.02 finally与return混用

(1)正常逻辑,如果出现异常

看如下代码,请问返回的是什么值?
00015.02 finally与return混用
讲道理,按照正常逻辑应该是 返回“异常”
00015.02 finally与return混用

(2)如果再加个finally,也return 会返回什么呢?

00015.02 finally与return混用
很容易被误导,以为会是“正数”,但是仔细想想,其实不对
00015.02 finally与return混用

如果finally中有return 那么就从finally块的return回去

00015.02 finally与return混用
00015.02 finally与return混用

二、如果没有return

00015.02 finally与return混用
00015.02 finally与return混用

00015.02 finally与return混用
你敢想象是这样的结果吗?
00015.02 finally与return混用
理解一下:return 是最终
00015.02 finally与return混用

再看看数字计算的例子
00015.02 finally与return混用
我们分析一下,这个地方输出是什么,
(1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。
finally中的代码都必须执行
(2)如果finally中有return,就从finally块的的return回去。
(3)如果finally中没有return,那么先把try或catch中该执行的执行完,
在return结束当前方法之前,先走一下finally,然后回去结束当前方法

按照我们上面的逻辑应该输出是
先输出 “finally”
然后输出 “exception”
最后输出 “0”

其中让人纠结的就是最后返回的是0 还是30 一定要注意
00015.02 finally与return混用
很容易出错,我之前的思路就错了,一定要注意
第二,为什么最后返回的的0 不是30 需要理解一下这句话
如果finally中没有return,那么先把try或catch中该执行的执行完,
在return结束当前方法之前,先走一下finally,然后回去结束当前方法

该执行的执行完 什么叫该执行的,该执行的是包括了把返回值的结果放到要带回调用处的位置,意思就是已经return了,如果按照上面的例子来说,就是已经把0返回去了,后面你怎么改都没用了

总结

(1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。
finally中的代码都必须执行
(2)如果finally中有return,就从finally块的的return回去。
(3)如果finally中没有return,那么先把try或catch中该执行的执行完,
在return结束当前方法之前,先走一下finally,然后回去结束当前方法

结论,如果finally中没有return,finally中的代码不影响返回值。

实际开发当做,不允许在finally当中return