关于try-catch的finally

知识点一:在Java的方法中,throw这个关键字只能throw throwable的子类。

知识点二:try-catch代码块在执行完之前,会先执行一下finally中的代码。

知识点三:假如在try中return 一个返回值,在finally里面又return了一个返回值,finally中的return会覆盖掉try中的return.

public static int testC() {
int i =1;
try {
return i;
} finally {
return 2;
}
}
public static void main( String[] args )
{
System.out.println(testC());
}

执行结果: 2
分析:try中的返回值被finally中的return给覆盖了,也就是丢失了逻辑。实际这是一个不合理的设计,finally中应该要做的只是在try中完成操作后,只进行必要的清理,不应该在finally中出现影响影响代码逻辑的代码。

知识点四:假如在try中return了一个i值,在finally中又对i进行了重新赋值。那么try中的return不受影响。

public static int testC() {
int i =1;
try {
return i;
} finally {
i = 2;
}
}
public static void main( String[] args )
{
System.out.println(testC());
}

执行结果:1
分析: 实际在finally中对i的重新赋值,并没有影响到return的返回。
查看机器码

public static int testC();
Code:
0: iconst_1
1: istore_0
2: iload_0
3: istore_2
4: iconst_2
5: istore_0
6: iload_2
7: ireturn
8: astore_1
9: iconst_2
10: istore_0
11: aload_1
12: athrow
Exception table:
from to target type
2 4 8 any

可以看到0-1,先把i放入第0个本地变量,到达return语句时,会将i从0个本地变量取出放入第二个本地变量,即保存现场,然后在finally中做的对i赋值的操作后,在将现场从第二个本地变量取出。所以返回值还是1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值