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后的内容是否为地址,如果是地址的话,其后内容可发生改变,如果为变量,则不可发生改变。

猜你喜欢

转载自blog.csdn.net/weixin_44517301/article/details/113277639