• 数梦工厂笔试题回顾一----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的结果。

  • 相关阅读:
    grep使用多个查询条件--或
    Qt Quick App的两种启动模式
    ICP编程软件配置(烧写KEIL编译后的bin文件)
    C/C++语言中const的用法
    QT小插件类之QRoundProgressBar
    QT实现单个EXE文件
    QT小技巧学习记录
    无线路由器的五种工作模式
    Qt5.4静态编译方法
    Altium Designer极坐标布局方法
  • 原文地址:https://www.cnblogs.com/tyf-19950315/p/smgc_try_finally_return.html
Copyright © 2020-2023  润新知