打字猴:1.700448869e+09
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 ]  [ 下一页 ]