一个简单的程序执行

简介: 一个简单的程序执行

正文


我们编写代码的时候,稍微的不注意,就会出现各种的异常。通常,我们的解决的方式是用try-catch-finally,来完成我们的异常处理。但是,我们忽略了一个细微的问题,他的执行顺序是怎么样的,如何执行的呢?


问题一:try-catch-finally哪些部分可以省略?

下面三种的书写方式都是可以的:

  1. try-catch-finally
  2. try-catch
  3. try-finally

也就是说,在try-catch-finally这3个部分,有两个部分是可以省略掉的,但是不能同时的省略。


问题二:执行的顺序问题:

如果我们在catch里面返回了,那么,finally还能执行吗?我们做一个简短的测试:


19.png

说明,在我们在我们返回前,finally都是可以执行的。

总结:

  1. finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。
  2. 如果在catch中return了,也会在return之前,先执行finally代码块
  3. 而且如果finally代码块中含有return语句,会覆盖其他地方的return。
  4. 对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。

但是finally一定会执行吗?答案是不一定的,因为如果在try代码块中,System.exit()强制退出程序。


深入研究执行的顺序

1. 如果返回值是基本的数据类型:


20.png


上面的结果是:6 ;因为finally里面的return会覆盖掉try里面的return


21.png


2. 返回值是引用数据类型

相应的,如果是引用类型,我们可以推测一下,基本数据类型的返回值存在栈里面,那么,引用类型的返回值的引用会存储在栈里面,这个时候,我们再次进行修改返回值,会得到相应的变化的。可以参考方法的值传递以及引用传递的效果,我们就可以得到相同的结论。


最后,我们应当注意的是:return之前必须会执行finally代码块,对于finally中没有return的语句来说:如果返回值是基本数据类型,finally块中对返回值的改变不会影响返回值。因为在return之前已经将返回值的内容存储在栈中了。

如果返回值是引用数据类型,finally块中对返回值的改变会影响返回值。因为在return之前已经将引用对象的地址存储在栈中,finally块中对于引用对象值的改变会影响到返回值。


相关文章
|
数据可视化 决策智能 Python
【江西省研究生数学建模竞赛】题目之二 国际“合作-冲突”的演化规律研究 建模方案及参考文献
本文介绍了江西省研究生数学建模竞赛题目之二“国际‘合作-冲突’的演化规律研究”的建模方案和参考文献,探讨了如何通过博弈论和决策树模型来分析和预测国家间的合作与冲突行为,并提出了评估国际环境和应对突发事件的策略。
203 0
【江西省研究生数学建模竞赛】题目之二 国际“合作-冲突”的演化规律研究 建模方案及参考文献
|
C#
57【C#基础】C#数据类型总结
【C#基础】C#数据类型总结
117 0
|
API Python 容器
Python全栈工程师(集合、函数)
       ParisGabriel                  感谢 大家的支持  你们的阅读评价就是我最好的动力  我会坚持把排版内容以及偶尔的错误做的越来越好                                                        ...
1244 0
|
MySQL 关系型数据库
基于MYSQL、R语言、SHINY的中型企业电子商务中心业务分析周报系统
基于MYSQL、R语言、SHINY的中型企业电子商务中心业务分析周报系统
2374 0
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
614 216
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
857 61