Java-try_catch_finally中带有return语句的执行顺序

我们知道,在try_catch_finally块对异常进行捕捉时,一定会执行到finally块中的语句。看下面例子:


Test1:(try语句中有return,finally中没有)

    public static void main(String[] args) {
        System.out.println(test());
    }

    public static int test() {
        int num = 10;
        try {
            System.out.println("try");
            return num += 50;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num > 50) {
                System.out.println("num=" + num);
            }
            System.out.println("finally");
        }
        return num + 20;
    }
}

执行结果:

try
num=60
finally
60

Test2:(try和finally语句中均有return语句)

public class TestFinallyDemo01 {
    public static void main(String[] args) {
         System.out.println(test());
    }

    @SuppressWarnings("finally")
    public static int test() {
        int num=10;
        try{
            System.out.println("try");
            return num+=50;
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(num>50){
                System.out.println("num="+num);
            }
            System.out.println("finally");
            return num+20;
        }           
    }
}

执行之后的结果:

try
num=60
finally
80

可以看出,在try语句块中,return num+=50分成了两条语句执行,num=num+50和return num;而这里只执行了num=num+50这句,然后进入finally块,最后在finally块中进行return.在finally块中有return语句的时候,会覆盖掉try语句中的return语句。


Test3(finally语句块中修改变量的值)

public class TestFinallyDemo03 {
    public static void main(String[] args) {
        System.out.println(test());
    }

    public static int test() {
        int num = 10;
        try {
            System.out.println("try");
            return num += 50;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num > 50) {
                System.out.println("num=" + num);
            }
            System.out.println("finally");
            num+=30;
                //return num; 加这句可以返回改变后的值
        }
        return num + 20;
    }
}

执行结果:

try
num=60
finally
60

这里可以看出,在final语句块中,num+=30执行后再try语句块中的return似乎并没有“感受”到。


Test4(finally语句块中修改引用变量的值)

public class TestFinallyDemo04 {
    public static void main(String[] args) {
        System.out.println(test().n);
    }

    public static Num test() {
        Num num=new Num();
        try {
            System.out.println("try");
            return  num;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num.n > 50) {
                System.out.println("num.n=" + num.n);
            }
            System.out.println("finally");
            num.n=200;
        }
        return num;
    }   
}
class Num{
       public int n=10;
}

执行后结果:

try
finally
200

总结:
1)若try语句块中有return,finally语句块中没有,则执行完try中的语句,然后执行finally语句中的语句,最后执行try中的return
2)若try语句块和finally语句块中均有return语句,则执行完try语句后,进入finally块,然后执行finally块中的return语句。
3)若try语句块中有return,在finally语句中修改变量值时,如修改的为值类型的数据,则在try语句块中相当于是不可见的,而如果是引用类型的值,则在try语句块中是可见的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值