打字猴:1.700448935e+09
1700448935
1700448936 该方法的返回值永远是1,而不会是-1或0(为什么不会执行到“return 0”呢?原因是finally执行完毕后该方法已经有返回值了,后续代码就不会再执行了),这都是源于异常代码块的处理方式,在代码中加上try代码块就标志着运行时会有一个Throwable线程监视着该方法的运行,若出现异常,则交由异常逻辑处理。
1700448937
1700448938 我们知道方法是在栈内存中运行的,并且会按照“先进后出”的原则执行,main方法调用了doStuff方法,则main方法在下层,doStuff在上层,当doStuff方法执行完“return a”时,此方法的返回值已经确定是in类型1(a变量的值,注意基本类型都是值拷贝,而不是引用),此后finally代码块再修改a的值已经与doStuff返回者没有任何关系了,因此该方法永远都会返回1。
1700448939
1700448940 继续追问:那是不是可以在finally代码块中修改引用类型的属性以达到修改返回值的效果呢?代码如下:
1700448941
1700448942 public static Person doStuff(){
1700448943
1700448944 Person person=new Person();
1700448945
1700448946 person.setName(“张三”);
1700448947
1700448948 try{
1700448949
1700448950 return person;
1700448951
1700448952 }catch(Exception e){
1700448953
1700448954 }finally{
1700448955
1700448956 //重新修改一下返回值
1700448957
1700448958 person.setName(“李四”);
1700448959
1700448960 }
1700448961
1700448962 person.setName(“王五”);
1700448963
1700448964 return person;
1700448965
1700448966 }
1700448967
1700448968 class Person{
1700448969
1700448970 private String name;
1700448971
1700448972 /*name的getter/setter方法省略*/
1700448973
1700448974 }
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{
[ 上一页 ]  [ :1.700448935e+09 ]  [ 下一页 ]