1 package test; 2 3 public class TestFinally { 4 public static void main(String[] args) { 5 Demo demo=new Demo(); 6 TestFinally tf=new TestFinally(); 7 String result=tf.fun1(demo); 8 System.out.println(result); 9 System.out.println(demo.str); 10 } 11 private String fun1(Demo demo) { 12 try { 13 demo.str+="1"; 14 return fun2(demo); 15 }finally{ 16 demo.str+="2"; 17 } 18 } 19 private String fun2(Demo demo) { 20 try { 21 demo.str+="3"; 22 return demo.str; 23 }finally{ 24 demo.str+="4"; 25 } 26 } 27 } 28 class Demo{ 29 String str=""; 30 }
执行结果:
13
1342
我写的答案是result=1234 demo.str=1234。在我的记忆中finally是异常捕获关键词,finally代码块一定会执行。但我对其的执行过程并不十分清楚,以前一直认为一旦遇到return返回,即代表函数结束,则finally在return之前执行。所以写出了如上错误结果。而通过正确结果,可以看出,函数在return执行完毕后如果有finally代码块存在,就会在return执行完毕的基础上继续执行finally中的代码块。所以结果为result=12 demo.str=1324。
进一步的,那如果finally中也有return将怎么执行呢?
(1)
1 package test; 2 3 public class TestFinally { 4 public static void main(String[] args) { 5 Demo demo=new Demo(); 6 TestFinally tf=new TestFinally(); 7 String result=tf.fun1(demo); 8 System.out.println(result); 9 System.out.println(demo.str); 10 } 11 12 private String fun1(Demo demo) { 13 try { 14 demo.str+="1"; 15 return fun2(demo); 16 }finally{ 17 18 demo.str+="2"; 19 } 20 } 21 22 private String fun2(Demo demo) { 23 try { 24 demo.str+="3"; 25 return demo.str; 26 }finally{ 27 demo.str+="4"; 28 return demo.str;//添加的return语句 29 } 30 } 31 32 33 } 34 class Demo{ 35 String str=""; 36 }
执行结果:
134
1342
(2)
1 package test; 2 3 public class TestFinally { 4 public static void main(String[] args) { 5 Demo demo=new Demo(); 6 TestFinally tf=new TestFinally(); 7 String result=tf.fun1(demo); 8 System.out.println(result); 9 System.out.println(demo.str); 10 } 11 12 private String fun1(Demo demo) { 13 try { 14 demo.str+="1"; 15 return fun2(demo); 16 }finally{ 17 demo.str+="2"; 18 return demo.str;//添加的return语句 19 } 20 } 21 22 private String fun2(Demo demo) { 23 try { 24 demo.str+="3"; 25 return demo.str; 26 }finally{ 27 demo.str+="4"; 28 } 29 } 30 31 32 } 33 class Demo{ 34 String str=""; 35 }
执行结果:
1342
1342
说明如果finally中也有return。则由于函数在return执行完毕后如果有finally代码块存在,就会在return执行完毕的基础上继续执行finally中的代码块,则finally中的return会覆盖try代码块中的return的结果。