java try catch finally记录
try catch finally
1、返回值问题
public static int getNum() {
int ret = 0;
try {
ret = 1;
return ret;
} finally {
ret = 2;
}
}
结果:1
结果分析:return ret;语句ret值1被缓存,然后在执行finally代码块,再return缓存的值1
2、finally 代码块中有return
public static int getNum() {
int ret = 0;
try {
ret = 1;
return ret;
} finally {
ret = 2;
return ret;
}
}
结果:2
结果分析:finally代码块中的return执行完后会直接退出方法,不会再执行try代码快中的return,或者catch代码块中的return,
也会吃掉try或者catch代码快中发生的异常;
2、finally 代码块中发生异常
public static int getNum2() { int ret = 0; try { ret = 1; int r = 1 / 0; return ret; } catch (Exception e) { ret = 3; throw new RuntimeException("catch"); } finally { ret = 2; throw new RuntimeException("finally"); } }
结果: java.lang.RuntimeException: finally
原因分析:
finally代码块的优先级最高,finally代码块中发生异常,会直接退出方法,对外暴露异常,并且会导致try或者catch代码快中发生的异常被吃掉,调用者感觉不到catch中发生的异常;
同样finally中有return语句,也会吃掉try或者catch代码快中发生的异常;
因此良好的代码风格是:
1、finally代码块中不要写return语句
2、finally代码块中的代码要用try{}catch(){}处理掉,保证finally代码块中不要有异常出现
其他人总结: