00015.02 finally与return混用
文章目录
前言
finally下的代码 是一定会执行的
一、finally与return的纠缠不清
(1)正常逻辑,如果出现异常
看如下代码,请问返回的是什么值?
讲道理,按照正常逻辑应该是 返回“异常”
(2)如果再加个finally,也return 会返回什么呢?
很容易被误导,以为会是“正数”,但是仔细想想,其实不对
如果finally中有return 那么就从finally块的return回去
二、如果没有return
你敢想象是这样的结果吗?
理解一下: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 一定要注意
很容易出错,我之前的思路就错了,一定要注意
第二,为什么最后返回的的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