1700448869
1700448870
}
1700448871
1700448872
}
1700448873
1700448874
//该方法抛出受检异常
1700448875
1700448876
public static int doStuff(int_p)throws Exception{
1700448877
1700448878
try{
1700448879
1700448880
if(_p<0){
1700448881
1700448882
throw new DataFormatException(“数据格式错误”);
1700448883
1700448884
}else{
1700448885
1700448886
return_p;
1700448887
1700448888
}
1700448889
1700448890
}catch(Exception e){
1700448891
1700448892
//异常处理
1700448893
1700448894
throw e;
1700448895
1700448896
}finally{
1700448897
1700448898
return-1;
1700448899
1700448900
}
1700448901
1700448902
}
1700448903
1700448904
对于这段代码,有两个问题:main方法中的doStuff方法的返回值是什么?doStuff方法永远都不会抛出异常吗?
1700448905
1700448906
答案是:doStuff(-1)的值是-1,doStuff(100)的值也是-1,调用doStuff方法永远都不会抛出异常,有这么神奇?原因就是我们在finally代码块中加入了return语句,而这会导致出现以下两个问题:
1700448907
1700448908
(1)覆盖了try代码块中的return返回值
1700448909
1700448910
当执行doStuff(-1)时,doStuff方法产生了DataFormatException异常,catch块在捕捉此异常后直接抛出,之后代码执行到finally代码块,就会重置返回值,结果就是-1了,也就是出现了先返回,再执行finally,再重置返回值的情况。
1700448911
1700448912
有读者可能会扩展思考了:是不是可以定义一个变量,在finally中修改后再return呢?代码如下:
1700448913
1700448914
public static int doStuff(){
1700448915
1700448916
int a=1;
1700448917
1700448918
try{
[
上一页 ]
[ :1.700448869e+09 ]
[
下一页 ]