一道关于try,finally执行顺序的面试题

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

 

 
 
  1. public class test { 
  2.  
  3.     /** 
  4.      * @param args 
  5.      */ 
  6.     public static void main(String[] args) { 
  7.         // TODO Auto-generated method stub 
  8.         System.out.println(new test().test());; 
  9.     } 
  10.  
  11.     static int test() 
  12.     { 
  13.         int x = 1
  14.         try 
  15.         { 
  16.             return x; 
  17.         } 
  18.         finally 
  19.         { 
  20.             ++x; 
  21.             System.out.println(x); 
  22.             System.out.println("aaa"); 
  23.         } 
  24.     } 
  25.  

 

运行结果是

 

2

aaa

1

 

为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

public class  smallT

{

       public static void  main(String args[])

       {

              smallT t  = new  smallT();

              int  b  =  t.get();

              System.out.println(b);

       }

      

       public int  get()

       {

              try

              {

                     return 1 ;

              }

              finally

              {

                     return 2 ;

              }

       }

}

 

返回的结果是2。

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

在讲解答案时可以用下面的程序来帮助分析:

public  class Test {

 

    /**

     * @param args add by zxx ,Dec 9, 2008

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       System.out.println(new Test().test());;

    }

 

    int test()

    {

       try

       {

           return func1();

       }

       finally

       {

           return func2();

       }

    }

   

    int func1()

    {

       System.out.println("func1");

       return 1;

    }

    int func2()

    {

       System.out.println("func2");

       return 2;

    }  

}

-----------执行结果-----------------

 

func1

func2

2

 

结论:finally中的代码比return 和break语句后执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: try catch finally执行顺序是先执行 try 块中的代码,如果出现异常则跳转到对应的 catch 块,执行 catch 块中的代码,最后无论是否出现异常,都会执行 finally 块中的代码。 ### 回答2: try catch finally 执行顺序是先执行 try 语句块中的代码,如果没有发生异常则跳过 catch 语句块,直接执行 finally 语句块中的代码。如果在 try 语句块中发生了异常,程序会跳出 try 块,然后寻找匹配的 catch 块来处理异常。如果找到了匹配的 catch 块,则执行这个块中的代码,并跳过 finally 块。如果没有找到匹配的 catch 块,则异常会传递到上层调用者,直到找到了匹配的 catch 块或程序结束。 无论是否发生异常,finally 语句块中的代码都会被执行,即使在 try 或 catch 块中有 return 语句。当异常被抛出时,会先执行 finally 块的代码,然后再将异常传递给上层调用者。 总结起来,try 语句块中的代码首先被执行,如果没有发生异常,则执行 finally 语句块中的代码;如果发生异常,则先执行 finally 语句块中的代码,然后执行匹配的 catch 语句块中的代码,最后再执行 finally 语句块中的代码。无论是否发生异常,finally 语句块中的代码都会被执行。 这种执行顺序的设计可以确保在程序执行过程中资源的释放和清理操作,即使发生了异常也能够得到处理。 ### 回答3: try catch finally 是一种错误处理机制。在程序执行过程中,当发生错误时,try语句块中的代码会被执行,如果没有错误发生,catch和finally语句块就不会执行。 try语句块中的代码被执行时,如果出现异常,程序会立即转到与之对应的catch语句块。catch语句块负责处理异常,并提供对应的异常处理逻辑。在catch语句块中,可以根据捕获到的异常类型进行相应的处理,例如输出错误信息、记录日志、回滚事务等。 无论是否发生异常,finally语句块中的代码都会被执行。这意味着,无论try块中的代码是否成功执行,finally语句块里的代码都会被执行到。finally语句块通常用于释放资源、回收内存等操作,在代码中确保必须执行的一段逻辑。 try catch finally执行顺序如下: 1. 程序首先执行try语句块中的代码。 2. 如果try语句块中的代码没有发生异常,catch语句块将被跳过。 3. 如果try语句块中的代码发生异常,运行时系统会查找与之对应的catch语句块,并执行相应的异常处理逻辑。 4. catch语句块执行完毕后,程序会继续执行finally语句块中的代码。 5. finally语句块中的代码执行完毕后,程序继续执行try catch finally块之后的代码。 总的来说,try catch finally块的执行顺序是:先执行try语句块,再执行catch语句块(如果有异常发生),最后执行finally语句块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值