try、catch、finally语句中有return 的各类情况


在 Java 的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally,如果 try 中有异常,则顺序为 try→catch→finally。但是当 try、catch、finally 中加入 return 之后,return 和 finally 的执行顺序让很多人混淆不清。

1、 try-catch-finally中均无return,仅4中有return

try{
                      //1、执行,无异常跳到finally块,有异常进入catch块
}catch(){  
            // 2、有异常且是对应异常类型进入执行,执行完毕进入finally块
}finally{
             // 3、执行,无论有无异常,执行万进入4
}
// 4、执行,无论有无异常,因为会被catch,有return

以下将1代表try代码块,2代表catch代码块,3代表finally代码块,4代表之外的代码块。

注意

1)3 和4无论有无异常都会执行,所有不能同时有return,这会导致4中的return是不可达代码,永远不会执行
在这里插入图片描述
2)2和4也不能同时有return语句,导致4中的return不可达
在这里插入图片描述
3)由于最后都会执行到3,故他们的return会覆盖try和catch的return语句
4)当try-catch-finally都没有return,最后会执行到4,但catch或finally中return,就会提前返回而不执行到4,导致4中return不可达
5)不能仅1中有return,会提示无返回语句错误,故2、3、4中至少有一个有return以应对有异常情况
在这里插入图片描述
6)当 try 代码块或者 catch 代码块中有 return 时,finally 中的代码总会被执行,且 finally 语句 return 返回之前执行。且若try-catch-finally同时有return,最中执行finally中的return

2、try 和 catch 中都带有 return ,finally无return

无异常执行try中return
有异常执行catch中return
当 try 代码块与catch 代码块中有 return 时,finally 中的代码总会被执行,且 finally 语句 return 返回之前执行。此时若在finally改变try与catchreturn语句中的变量值并不会造成影响,无论该变量是基本类型还是引用类型,因为return表达式的值已经提前计算并缓存
在这里插入图片描述
当 try 代码块或 catch 代码块中的 return 返回值类型为普通变量或引用变量时,即使在后面 finally 代码块中对返回值的变量重新赋值,也不会影响最后返回的值。

3、finally 中带有 return
此时try与catch可以有return,也可以没有,最终返回finally中return
当 finally 有返回值时,会直接返回该值,不会去返回 try 代码块或者 catch 代码块中的返回值。
注意:finally 代码块中最好不要包含 return 语句,否则程序会提前退出。

4、1和4均有return,即当try有return而catch、finally有return,此时4中必须要有return
当无异常,执行try中的return,仍会执行finally,但4不在执行
当有异常,执行4中return

3 总结

  • 当 try 代码块和 catch 代码块中有 return 语句时,finally 仍然会被执行。
  • 执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行 finally 语句。
  • 无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。
  • finally 代码块中的 return 语句一定会执行
  • 4中和2(3)不能同时出现return,导致4中不可达
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值