try、catch、finally中的return顺序和有效性
声明:参考资料来源 http://blog.youkuaiyun.com/wangqingbo0829/article/details/52458283,本人出于学习,收集干货,不作商业用途!
今天面试的时候,被问到这个return的执行结果和顺序,发现自己有些遗忘了,于是回来赶紧查一下相关的资料,看到这篇文章写得很好 http://blog.youkuaiyun.com/wangqingbo0829/article/details/52458283 自己总结,测试了一些,内容大致如下:
总结来说:
1,如果这个结构体外有return,会和里面这几个的return互斥,编译器会报错
2,有异常的话,返回的是finallly中的return 的值,其他的都将失效,return之前的代码都有效。
3,没异常的话:
1)finally中有return,执行finally中的return:
2)finally中没有return,try有return,返回的是try中return的值,但是会执行finally中的代码再return。
4,都有return的情况下,catch中的return基本不会起作用
(结合上面的图片可知)
catch和finally中,可同时存在return,编译能通过。但程序以finally中的return为准,不会理睬catch中的return ,catch中return之前的代码仍然生效。
2018年5月14日补充:
原文:https://blog.youkuaiyun.com/kavensu/article/details/8067850
结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
try 中可以抛异常,但是有点多余,当然在某些特定环境下可以抛异常,但是不能同时抛异常又return,会报错:
try 和 finally 都没有return 此时是又有抛出异常,则执行catch的return
易错,注意:如果finally中没有return,而try中有return,最终会返回try中a的值,虽然此时程序中的a是3了。因为在try语句的return块中,return返回的引用变量并不是try语句外定义的引用变量i,而是系统重新定义了一个局部引用i’,这个引用指向了引用i对应的值,也就是1,即使在finally语句中把引用i指向了值3,因为return返回的引用已经不是i,而是i’,所以引用i的值和try语句中的返回值无关了。
结束和声明
以上纯属个人观点和体会
希望这篇文章能对你有所帮助!
欢迎大家来一起讨论分享干货,或者批评指正!
更加热切盼望各路大神前辈给些指导和建议!
以后会不定期更新心得和总结,包括学习过程中各种异常和解决办法等等。再见!
转载请注明出处!或者联系我!(chenruijia_java@163.com)