1700448975
1700448976
此方法的返回值永远都是name为李四的Person对象,原因是Person是一个引用对象,在try代码块中的返回值是Person对象的地址,finally中再修改那当然会是李四了。
1700448977
1700448978
(2)屏蔽异常
1700448979
1700448980
为什么明明把异常throw出去了,但main方法却捕捉不到呢?这是因为异常线程在监视到有异常发生时,就会登记当前的异常类型为DataFormatException,但是当执行器执行finally代码块时,则会重新为doStuff方法赋值,也就是告诉调用者“该方法执行正确,没有产生异常,返回值是1”,于是乎,异常神奇的消失了,其简化代码如下所示:
1700448981
1700448982
public static void doSomething(){
1700448983
1700448984
try{
1700448985
1700448986
//正常抛出异常
1700448987
1700448988
throw new RuntimeException();
1700448989
1700448990
}finally{
1700448991
1700448992
//告诉JVM:该方法正常返回
1700448993
1700448994
return;
1700448995
1700448996
}
1700448997
1700448998
}
1700448999
1700449000
public static void main(String[]args){
1700449001
1700449002
try{
1700449003
1700449004
doSomething();
1700449005
1700449006
}catch(RuntimeException e){
1700449007
1700449008
System.out.println(“这里永远都不会到达!”);
1700449009
1700449010
}
1700449011
1700449012
}
1700449013
1700449014
上面finally代码块中的return已经告诉JVM:doSomething方法正常执行结束,没有异常,所以main方法就不可能获得任何异常信息了。这样的代码会使可读性大大降低,读者很难理解作者的意图,增加了修改的难度。
1700449015
1700449016
在finally中处理return返回值,代码看上去很完美,都符合逻辑,但是执行起来就会产生逻辑错误,最重要的一点是finally是用来做异常的收尾处理的,一旦加上了return语句就会让程序的复杂度徒然提升,而且会产生一些隐蔽性非常高的错误。
1700449017
1700449018
与return语句相似,System.exit(0)或Runtime.getRuntime().exit(0)出现在异常代码块中也会产生非常多的错误假象,增加代码的复杂性,读者有兴趣可以自行研究一下。
1700449019
1700449020
注意 不要在finally代码块中出现return语句。
1700449021
1700449022
1700449023
1700449024
[
上一页 ]
[ :1.700448975e+09 ]
[
下一页 ]