Java 异常处理:finally,return

1 语句的执行顺序

try{ } 中有个return 语句,那么紧跟在try后面的finally{ } 中的代码是否被执行?如果执行,什么时候被执行?是在return前还是return后?

例如这个函数:

public static int testFinally1(){
int res = 1;
try {
res = 2;
return res;
}catch (Exception e){
res = 3;
return res;
}finally {
System.out.println("finally1");
res = 4;
return 4;
}
}


当在main函数中使用

int res1 = testFinally1();
System.out.println(res1);

打印结果的时候,输出结果是:



这说明尽管try里面有return语句,finally中的代码还是会执行,另外,打印出来的是4而不是2,说明finally中的return会覆盖掉其他地方的return语句。

2 return的内容

同样对于上面的例子,如果将finally中的return去掉,结果会是怎么样的呢?


可以看到尽管finally中尝试改变res的值,但是最终return的值还是返回的try块中的res的值。这种情况只是对于基本类型的数据成立,对于引用类型的数据会有影响,如下例:


所以,可以这样理解:程序在执行return时会首先将返回值存储在一个指定的位置,其次去执行finally块,最后再返回。在testFinally1中执行finally前先将return的值(2)存储在一个指定位置,然后去执行finally中的代码,此时修改res的值并不会影响return的结果。但是在testFinally2中,虽然在执行finally前同样会将返回的结果存储在指定的位置,但是由于此时str是引用类型,在finally中修改str的值会修改返回的结果。

3 finally中的代码是否一定会被执行?

不一定。下面两种情况就不会执行finally中的代码:
(1)程序在进入try语句之前就出现了异常;
(2)try中有强制退出时,比如try中使用了语句:System.exit(0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值