如何处理不同情形下 return 和 finally 的执行顺序?

百家 作者:程序人生 2018-12-09 11:14:01

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事

本文来自CSDN博客专家Carson_Ho的博文,如需转载,请联系原文作者,点击文末“阅读原文”可直接访问作者博客。
在Java中,不同情形下return和finally的执行顺序很多人混淆不清。本文全面&详细解析不同情形下return和finally的执行顺序,希望你们会喜欢。

1. 储备知识

try / catch是常见的捕捉异常 & 处理的语句;只有try语句中抛出异常,才会执行catch中的语句。

/**
  * try中无抛出异常,则catch中的代码不执行 
  */

    try
        // 代码无抛出异常 
        return  result; 

      }catch(Exception e){ 
        // catch代码 
     }

 /**
   * try中抛出异常,则执行catch中的语句
   */

     try
        //代码抛出异常 
        throw Exception; 
        return1  result1; 

      } catch(Exception e){ 
       return2  result2; // 执行catch中的语句
     }


2. 终极结论


无论什么情况(异常与否、try / catch 前面存在return),finally块代码一定会执行。必须谨记!!

3.具体场景分析

下面,我将根据具体的使用场景来全面解析不同情形下return和finally的执行顺序

3.1 try或catch中存在return语句、finally无return语句

执行顺序,结论如下:

  • return后的语句-> finally语句 -> return结束函数 & 返回值

finally语句不影响最终返回值,即返回值在finally前就决定

详细讲解,此处细分为2种情况:

  1. try中有return、无抛出异常;

  2. try中有return、抛出异常 、catch有return。

/**
  * 情况1:try中有return、无抛出异常 
  * 实际执行顺序:
  *            1. 执行 try块语句
  *            2. 执行 return后 的语句:得到结果result & 保存下来
  *            3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
  *            4. 执行 return,结束函数,返回result的值:依旧返回步骤2保存的结果
  */

    try
      //代码无抛出异常 
      return  result; 

        }catch(Exception e){ 

         }finally
          // finally代码 
     }

/**
  * 情况2:try中有return、抛出异常 、catch有return
  * 实际执行顺序:
  *            1. 执行 try块语句
  *               2. 执行 throw 语句 :此时已抛出异常,运行因异常而终止,故不执行return1
  *            3. 执行 catch块语句 
  *               4. 执行 return2后 的语句:得到结果result2 & 保存下来
  *             5. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
  *             6. 执行 return2,结束函数,返回result2的值:依旧返回步骤4保存的结果   
  */

    try
      //代码抛出异常 
      throw Exception; 
      return1  result1; 

       }catch(Exception e){ 
        return2  result2; 

       }finally
         // finally代码 
      }


3.2 finally中存在return语句(无论try或catch之一或都存在return语句

执行顺序,结论:

当执行到finally语句的return时,程序就直接返回:

finally中的return会覆盖掉其它位置的return。

详细讲解,此处细分为2种情况:

  1. try&catch中都无return、无抛出异常&finally中有return;

  2. try/catch中任意1者或都有return(try中的return和catch中的return最多只有1个会执行)、finally中有return。

**
  * 情况1try & catch中都无return、无抛出异常 & finally中 有 return
  * 实际执行顺序:
  *            1. 执行 try块语句
  *            2. 执行 finally块语句:会影响返回值
  *            3. 执行 return,结束函数,返回result的值
  */
    try

      }catch(Exception e){ 

      }finally
         return result ;
     }

/**
  * 情况2:try / catch中任意1者 或 都有return(try中的return和catch中的return最多只有1个会执行)、finally中 有 return
  * 实际执行顺序:
  *            1. 执行 try块语句:设无抛出异常,则不执行catch语句 & return2
  *               2. 执行 return1 后 的语句:得到结果result & 保存下来
  *            3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
  *               4. 执行finally内的 return3 后语句:finally中的return会覆盖掉其它位置的return
  *               5. 执行return3 ,结束函数,返回result3的值
  */

    try
      //throw Exception; 
      return1 result1; 

        }catch(){ 
             return2 result2;

        }finally
             return3 result3; 
        }

特别注意,finally中的语句最好:

  1. 不要包含return语句,否则程序会提前退出;

  2. 返回值≠try或catch中保存的返回值。

至此,关于不同情形下return和finally的执行顺序 情况讲解完毕。

4. 总 结

本文主要讲解了不同情形下return和finally的执行顺序,总结如下:

---【End】---

推荐阅读:

print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!");
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!n");
cout < < "点个赞吧!" < < endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!");
Response.Write("点个赞吧");
alert(’点个赞吧’)

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接