try..catch..finally执行顺序return

try..catch..finally这个语法大家都很熟悉,就是捕捉异常、处理异常,面试中经常被问到的一个问题是:如果在try...catch中的某某地方return了,那么之后的某某步骤还会不会执行。今天就来用代码分析一下各种可能的执行情况,懒得看文章的话,直接看最后的总结,如果不明白再回头看文章。

1.首先要明确一个,在finally里面是不能执行return语句的,如果在finally中使用了return,则会提示这样的错误:“控制不能离开 finally子句主体”。如图1:      

              

                  图1

2.只有try中有return语句

当一个捕捉异常语句中只有try语句中有return时,如下代码:

private string   tryFun(int num)

{

     int result = 0;

     try

     {

          result = 10 / num;

          return "1";

     }

     catch

     {                

     }

     finally

     {

                

     }

     return "-2";

}

如果这时候num的值为0,则会出现除0的异常,则return “1”不执行,而去执行catch,因为此时假设只有try中有return语句,所以当catch执行完之后将会执行函数最后的return “-2”语句;如果try语句块中没有异常,则return "-2"语句不执行。

3.只有catch中有return语句

当一个捕捉异常语句中只有catch语句中有return时,如下代码:

private string   tryFun(int num)

{

     int result = 0;

     try

     {

          result = 10 / num;         

     }

     catch

     {                

            return "-1";

     }

     finally

     {

                

     }

     return "-2";

}    

如果这时候num的值为0,则会出现除0的异常,则去执行catch,因为此时假设只有catch中有return语句,所以当catch执行完之后直接return “-1”,就不执行finally之后的语句(finally块中的语句肯定是会执行的),也就是在这里return “-2”语句不执行。

4.当try...catch中都有return语句

当try...catch中都有return语句,代码如下:

 private string   tryFun(int num)

 {

      int result = 0;

      try

      {

          result = 10 / num;

          return "try";

      }

      catch

      {

          return "catch";

      }

      finally

      {

      }

      return "-2";

 }

这时,不管执行的是try还是catch中的语句,return “-2”永远都不执行,也就是finally之后的语句都不执行了(finally里面的语句肯定还是执行啦)。

总结:不管是执行try还是catch,finally中的语句肯定是会执行的;不管是执行try还是catch,如果所执行的语句中(try和catch中的return只有一个会执行,如果被catch了,肯定是执行catch语句中的return;如果没有被catch,那肯定是执行try中的return。这里假设它们中有return,如果没有return,肯定会执行finally后面的语句)有return语句,则finally之后的语句就不执行(finally里面的语句肯定还是执行啦);如果是执行try或catch中的语句块没有return语句,则finally后面的语句还是会执行的。

你可能感兴趣的:(finally)