【Java -- 基础】了解 return 和 finally 的执行顺序

前言

在 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中的语句
     }

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

2. 场景分析

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

  • 执行顺序
    return 后的语句-> finally 语句 -> 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代码 
      }

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

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

  • 栗子

/**
  * 情况1:try & 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 中的语句最好:

  • 不要包含return语句,否则程序会提前退出
  • 返回值 ≠ try 或 catch中保存的返回值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值