return和finally谁先执行

return和finally谁先执行

finally是什么呢?

finally是用于try-catch-finally捕获异常语句中的代码块,其作用为:在进行异常的处理之后,在异常的处理格式中还有一个finally语句,那么此语句将作为异常的统一出口,不管是否产生了异常,最终都要执行此段代码。

用途:

finally块一般是用来关闭(释放)物理资源(数据库连接,网络连接,蓝牙连接,磁盘文件等)。


我们面试中可能会遇到一个问题,就是说finally既然是不管发不发生异常都必须执行的语句,那当在try或catch代码块执行return语句,那么finally语句还是否会执行呢?

当代码在执行中在try块或catch块中遇到了return语句时代码并不是直接结束当前方法,而是在结束前会在JVM中进行一些操作,此时return语句的作用是先将return后的值进行了复制,然后执行finally语句。
如果return复制的语句为一段值,则该语句无法被更改,最终执行得到的内容只能为return后的语句。
但如果return后的语句为一段地址,那么如果在finally中改变了地址中的某值,return结束后所得到的值,只能为地址被更改后的值,所以return的值被改变了。

这样的解释可能比较抽象,下面我们通过代码来为大家展示一下具体的操作情况。

return后为变量值:

public static void main(String[] args) {
        System.out.println(say());
    }
    static int say(){
        int a = 10;
        try{
            return a;
        }catch (Exception e){
            return a;
        }finally {
            a=30;
        }
    }

执行结果如下:
return后为变量值
return后为地址时:

public class Demo {
    public static void main(String[] args) {
        Having h = say();
        System.out.println(h.num);
    }
    static Having say(){
        Having having = new Having();
        try{
            return having;
        }catch (Exception e){
            return having;
        }finally {
            having.num=30;
        }
    }
}
class Having{
    int num = 10 ;
}

return后为地址时输出的内容:
return后为地址时输出的内容

从上述话中,我们可以得出结论,即使在try或catch代码块中有return语句,也会执行finally语句,但是finally能否改变返回的值,取决于return后的内容是否为地址,如果是地址的话,其后内容可发生改变,如果为变量,则不可发生改变。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值