java try-catch-finally中return,最终return

try-catch-finally中return,最终return

都知道try-catch-finally是异常捕获,其中try{执行的代码,若有异常进入catch},catch{出现异常执行},finally{无论正常异常都要执行}。
1)正常:

public static String m1() {
    try {
        System.out.println("try ...");
    } catch (Exception e) {
        System.out.println("catch ...");
    } finally {
        System.out.println("finally ...");
    }
    return "hello";
}

// 结果:
try ...
finally ...
hello

顺序进行,try执行,未有异常finally结束。

2)异常:

public static String m1() {
   try {
        int i = 10 / 0;
        System.out.println("try ...");
    } catch (Exception e) {
        System.out.println("catch ...");
    } finally {
        System.out.println("finally ...");
    }
    return "hello";
}

// 结果:
catch ...
finally ...
hello

try执行,出现异常,进入catch,在进入finally结束。
以上都是我们的正常流程,不是今天的重点,接下来就是今天的重点在这三部分中执行return最终返回的是哪个?
1、情形一(try中return)

public static String m1() {
   try {
        // int i = 10 / 0;
        // System.out.println("try ...");
        return "try ...";
    } catch (Exception e) {
        System.out.println("catch ...");
    } finally {
        System.out.println("finally ...");
    }
    return "hello";
}

// 结果:
finally ...
return = try ...

看结果,在返回结果之前先进入finally,该种情况下要是我们想要返回值是可以得到我们想要的结果。
2、情形二(catch中return)

public static String m1() {
    try {
        int i = 10 / 0;
        System.out.println("try ...");
        // return "try ...";
    } catch (Exception e) {
        System.out.println("catch ...");
        return "catch ...";
    } finally {
        System.out.println("finally ...");
    }
    return "hello";
}

// 结果:
catch ...
finally ...
return = catch ...

程序执行完,return要在执行完finally之后返回,和情形一类似。
3、情形三(finally中return)

public static String m1() {
try {
        int i = 10 / 0;
        System.out.println("try ...");
        // return "try ...";
    } catch (Exception e) {
        System.out.println("catch ...");
        // return "catch ...";
    } finally {
        System.out.println("finally ...");
        return "finally ...";
    }
    // return "hello";
}

//结果:
catch ...
finally ...
return = finally ...

情形一,二,三都是只有一个renturn的,在return之前都要保证finally被执行完。
4、情形四(try或者catch中有并且finally也有)
根据前三种情况,分析一下最终的return会是哪一个?

public static String m1() {
    try {
        // int i = 10 / 0;
        System.out.println("try ...");
        return "try ...";
    } catch (Exception e) {
        System.out.println("catch ...");
        // return "catch ...";
    } finally {
        System.out.println("finally ...");
        return "finally ...";
    }
    // return "hello";
}

// 结果:
try ...
finally ...
return = finally ...

可以看到输出的是finally中的,按理来说应该是顺着执行下来,先来try or catch中的才是。

结论:顺序执行,到达try or catch 中的return,先挂起,等待finally执行完毕在return,但是finally中return时,执行完finally就被提前return了,导致无法再去return try or catch中的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值