浅谈 try-catch-finally的执行顺序

根据这几个维度,有没有异常,有没有返回值

一.无返回值的情况

try {
    a();
    b();
} catch (Exception e) {
    c();
} finally {
    d();
}
e();

1.无异常

正常执行顺序

a()->b()->d()->e();

2.有异常

这里假设a();有异常,然后b()就不会走

a()->c()->d()->e();

二.有返回值

1.try中有返回值

public int method() {

  try {
    return 1;
  } catch (Exception e) {
    //处理异常
  } finally {
    // 这里是finally块中的代码
  }

  return 2;
}
  1. try块开始执行,计算并返回值1。
  2. 在try块内执行到return 1时,会先执行finally块中的所有代码
  3. finally块执行完毕后,方法将返回try块中指定的值1。
  4. 虽然在try-catch-finally结构之后还有一个return 2语句,但由于在try块中已经遇到了return语句并退出了方法,因此return 2;不会被执行。

    所以,该方法最终会返回值1。注意,无论finally块中有无return语句,在try或catch中一旦执行了return语句,finally块会先执行,然后方法会立即返回之前指定的值,不会再执行后续任何return语句。

 2.catch中有返回值

public int method() {
    try {
        // ...
    } catch (Exception e) {
        return 1; // 如果有异常,这里会立即返回1
    } finally {
        // 这里的代码无论是否抛出异常都会被执行
    }
    return 2; // 如果没有异常,并且catch块没有return,则最终返回2
}
  1. 尝试执行try块中的代码。
  2. 如果try块中抛出了异常,程序会跳转到相应的catch块,执行其中的代码并返回1。在Java中,无论try块或catch块内是否有异常抛出,并且无论是否执行了return语句,finally块中的代码都一定会被执行(除非在finally块内部又抛出了未被捕获的异常或者调用了System.exit()终止程序),当然是在执行catch中return之前,执行我们的finally代码块,同理我们的return2 就不执行啦.
  3. try块中没有抛出异常,那么catch块不会被执行,之后执行finally块中的代码,最后执行return 2

因此,在上述代码示例中,方法最终返回的值只能是1或2,具体取决于try块是否抛出异常。

3. try块和finally块中有return

public int method() {
    try {
        return 1; // try块中的return语句
    } catch (Exception e) {
        // catch块
    } finally {
        return 2; // finally块中的return语句
    }
}
  • 无异常:程序执行try块中return之前代码;再执行finally块,因为finally块中有return所以提前退出,而不再执行try中的return;
  • 有异常:不执行try,顺序执行catch-finally

4 .catch块和finally块中有return

public int method() {
 try{return 1;}
 catch(){return 2;}
 finally{return 3;}

}

无异常的情况:

  • 如果try块中的代码正常执行且没有抛出异常,则程序将跳过catch块直接进入finally块执行。由于finally块中有return 2,所以最终方法会返回值2。

有异常的情况:

  • try块中的代码抛出异常,并被捕获到catch块中时,程序首先执行catch块内的所有代码,包括return 1前的任何表达式运算。然后,不论catch块是否已执行了return,都会继续执行finally块。由于finally块中含有return 2,因此即使catch块中已经有return,最终的方法返回值仍然是finally块中的返回值(即2)。

结论: 无论是无异常还是有异常的情况下,只要finally块中存在return语句,方法最终都将返回finally块中的返回值(本例为2)。

今天先这样.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值