try、catch和finally中的return到底该怎么执行

try、catch和finally中都有return语句,执行哪一个return?

上代码解释:

第一步,return全开,并在try块中给个异常,执行结果:lastValue = finally-test;说明最终return的是finally块中的赋值;

public class TryCatchTest {
    public static void main(String[] args) {
        TryCatchTest tryCatchTest = new TryCatchTest();
        String lastValue = tryCatchTest.t();
        System.out.println("lastValue = " + lastValue);
    }

    public String t() {
        String s = "try-test";
        try {
            //抛个异常
            this.throwException();
            return s;
        } catch (Exception e) {
            s = "catch-test";
            return s;
        } finally {
            s = "finally-test";
            return s;
        }
    }

    public void throwException() throws Exception {
        throw new Exception("抛个异常!");
    }
}

第二步,让try块中正常执行,执行结果:lastValue = finally-test;好诡异,return的仍然是finally的赋值,诡异;

public String t() {
        String s = "try-test";
        try {
            //抛个异常
//            this.throwException();
            return s;
        } catch (Exception e) {
            s = "catch-test";
            return s;
        } finally {
            s = "finally-test";
            return s;
        }
    }

第三步:不让finally执行 return了,异常后return的是catch的赋值:lastValue = catch-test,抛异常了,try中的return是肯定不会执行了,这个还符合预期;

public String t() {
        String s = "try-test";
        try {
            //抛个异常
            this.throwException();
            return s;
        } catch (Exception e) {
            s = "catch-test";
            return s;
        } finally {
            s = "finally-test";
//            return s;
        }
    }

第二回合中,不是说try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 try 中的 return 语句先执行呀,可结果并不如预期,这是因为finally 语句后执行,但try中的 return 并不是让函数马上返回结果,而是 return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回。但此时会出现两种情况:
① 如果finally中也有return,则会直接返回finally中的return结果,并终止程序,函数栈中的return不会被完成
② 如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中保存的try return的内容返回并终止程序

注意:

1、不管有没有出现异常,finally块中代码都会执行
2、当try和catch中有return时,finally仍然会执行
3、finally是在try中return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值