关于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

你可能感兴趣的:(Core,Java,java)