zoukankan      html  css  js  c++  java
  • 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后面的语句还是会执行的。

  • 相关阅读:
    Java多线程
    2018腾讯校招软件开发岗在线笔试题
    2018京东校招Java笔试题
    计模式之中介者、观察者
    值得注意的Java基础知识
    Java的内部类
    用静态内部类实现单例模式
    String,StringBuilder区别,一个是常量,一个是可变量
    ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象
    List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/3962580.html
Copyright © 2011-2022 走看看