关于try、catch、finally中return的执行顺序

本文详细介绍了Java中try、catch、finally块中return的执行顺序和有效性。无论是否抛出异常,finally块的代码都会执行。如果有return,finally中的return值将决定函数返回值,catch中的return通常不起作用。建议finally中避免使用return,以防止意外退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值