数梦工厂笔试题回顾一----finally在return之后执行还是之前?

 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 }
View Code

执行结果:

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 }
View Code

执行结果:

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 }
View Code

执行结果:

1342
1342

说明如果finally中也有return。则由于函数在return执行完毕后如果有finally代码块存在,就会在return执行完毕的基础上继续执行finally中的代码块,则finally中的return会覆盖try代码块中的return的结果。

转载于:https://www.cnblogs.com/tyf-19950315/p/smgc_try_finally_return.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值