在有return语句时try catch finally的执行顺序(总结)

先说结论

1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return(这里编译器会有警告),否则程序会提前退出,返回值不是try或catch中保存的返回值,而是finally中return的值。
5、如果try和catchreturn是一个变量(包括引用类型变量)且函数的返回是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。

下面开始测试:

1.try和catch中有return时,finally里面的语句会被执行吗

我们可以来分别看看
(1)执行try中的return时

public class tryDemo {
    public static int show() {
        try {
            return 1;
        }finally{
            System.out.println("finally模块被执行");
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

输出结果如下:
è¿éåå¾çæè¿°

(2)执行catch中的return时

public class tryDemo {
    public static int show() {
        try {
            int a = 8/0;
            return 1;
        }catch (Exception e) {
            return 2;
        }finally{
            System.out.println("finally模块被执行");
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

其结果如下:
è¿éåå¾çæè¿°

我们可以得出结论:

如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句在return语句执行之后return返回之前执行的。可以使用编译器的Debug功能查看详细过程。

2.如果finally也有return的时候……

public class tryDemo {
    public static int show() {
        try {
            int a = 8/0;
            return 1;
        }catch (Exception e) {
            return 2;
        }finally{
            System.out.println("finally模块被执行");
            return 0;
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

执行结果如下:
è¿éåå¾çæè¿°

结论:

我们可以看到当finally有返回值时,会直接返回。不会再去返回try或者catch中的返回值。

3.finally中对于返回变量做的改变会影响最终的返回结果吗

我们先来看一看如果try或者catch中的返回值是普通变量时。

public class tryDemo {
    public static int show() {
        int result = 0;
        try {
            return result;
        }finally{
            System.out.println("finally模块被执行");
            result = 1;
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

执行的结果如下:
è¿éåå¾çæè¿°

并不会改变返回的内容。
当返回的变量的类型是引用类型时,结果也是一样的。

代码如下:

public class tryDemo {
    public static Object show() {
        Object obj = new Object();
        try {
            return obj;
        }finally{
            System.out.println("finally模块被执行");
            obj = null;
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

结果如下:

è¿éåå¾çæè¿°

我们可以得出以下结论:

如果try和catch的return是一个变量,且函数的返回是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值