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

2018 年 12 月 9 日 程序人生

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

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

本文来自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(’点个赞吧’)

登录查看更多
0

相关内容

【ICML2020】用于强化学习的对比无监督表示嵌入
专知会员服务
27+阅读 · 2020年7月6日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
113+阅读 · 2020年5月24日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
MIT新书《强化学习与最优控制》
专知会员服务
275+阅读 · 2019年10月9日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
PLANET+SAC代码实现和解读
CreateAMind
3+阅读 · 2019年7月24日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
95行代码破解极验滑动验证码(附源码)
FreeBuf
11+阅读 · 2018年5月9日
CVE-2018-7600 - Drupal 7.x 远程代码执行exp
黑客工具箱
14+阅读 · 2018年4月17日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
实战|利用卷积神经网络处理CIFAR图像分类
全球人工智能
4+阅读 · 2017年7月22日
Arxiv
6+阅读 · 2018年11月1日
Arxiv
3+阅读 · 2018年5月11日
Arxiv
4+阅读 · 2018年2月13日
VIP会员
相关VIP内容
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
PLANET+SAC代码实现和解读
CreateAMind
3+阅读 · 2019年7月24日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
95行代码破解极验滑动验证码(附源码)
FreeBuf
11+阅读 · 2018年5月9日
CVE-2018-7600 - Drupal 7.x 远程代码执行exp
黑客工具箱
14+阅读 · 2018年4月17日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
实战|利用卷积神经网络处理CIFAR图像分类
全球人工智能
4+阅读 · 2017年7月22日
Top
微信扫码咨询专知VIP会员