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

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

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

640?wx_fmt=jpeg

本文来自优快云博客专家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的执行顺序,总结如下:

640?wx_fmt=png

---【End】---

640?wx_fmt=jpeg

推荐阅读:

640?wx_fmt=gif


 

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

在车辆工程中,悬架系统的性能评估优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
### Java 中异常处理的详细机制用法 #### 一、Java 异常处理概述 Java 的异常处理是一种用于管理程序运行时错误的机制。它通过一组特定的关键字来实现,这些关键字分别是 `try`、`catch`、`finally`、`throw` `throws`。它们共同构成了完整的异常处理框架。 #### 二、核心概念与功能描述 1. **`try` 块** - `try` 块用来包裹可能引发异常的代码片段。 - 如果在 `try` 块内的任何位置发生异常,则控制权会被转移到相应的 `catch` 或者 `finally` 块中[^1]。 2. **`catch` 块** - 当 `try` 块中的某部分代码抛出了指定类型的异常时,对应的 `catch` 块就会被触发并执行。 - 可以定义多个 `catch` 块来捕获不同类型的异常,按照优先级顺序排列(子类异常先于父类异常)。如果某个异常被捕获到,后续的 `catch` 将不会再被执行[^3]。 3. **`finally` 块** - 不论是否发生了异常,也不管是否有匹配的 `catch` 存在,`finally` 都会无条件地执行。 - 特殊情况下,比如在 `try` 或 `catch` 中调用了终止 JVM 运行的方法(如 `System.exit()`),则 `finally` 才不会被执行。 4. **`throw` 关键字** - 使用 `throw` 明确地抛出一个具体的异常对象实例给上层调用方。 - 它通常出现在函数内部逻辑判断之后,当检测到不符合预期的情况时主动发出信号通知外部环境存在某种问题需要解决[^2]。 5. **`throws` 关键字** - 方法签名处声明该方法可能会向外传递哪些种类的受检异常(Checked Exception)。 - 调用此类带有 `throws` 声明的方法时,要么在其周围加上合适的 `try-catch` 结构自行处理;要么继续沿链路向上传播直至找到能够妥善处置的地方为止[^4]。 #### 三、实际应用案例分析 下面展示了一个简单的例子说明如何综合运用上述各个组成部分完成基本的任务需求: ```java public class TestException { public static void main(String[] args) { try { int result = divideNumbers(10, 0); System.out.println("Result is:" + result); } catch (ArithmeticException e) { System.err.println("Error occurred during division operation."); } finally { System.out.println("Execution completed regardless of outcome."); } } private static int divideNumbers(int numerator, int denominator) throws ArithmeticException{ if(denominator == 0){ throw new ArithmeticException("Division by zero not allowed!"); } return numerator /denominator; } } ``` 在这个示例里: - 我们尝试计算两个整数相除的结果; - 若分母为零,则会在 `divideNumbers` 函数内利用 `throw` 提交自定义消息告知出现了算术违规状况——即所谓的“除以零”的情形; - 主线程接收到这个事件后立即进入关联的捕捉分支予以反馈提示; - 最终无论如何都会显示结束状态的通知信息。 #### 四、总结要点 综上所述,在开发基于 Java 平台的应用软件过程中合理采用这套完善的错误监控体系可以有效提升系统的健壮性用户体验满意度。掌握好每一个组件的作用及其相互之间的协作关系至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值