一个简单的程序执行

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

正文


我们编写代码的时候,稍微的不注意,就会出现各种的异常。通常,我们的解决的方式是用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块中对于引用对象值的改变会影响到返回值。


相关文章
|
7月前
|
监控 测试技术 程序员
解决线程死循环问题的有效方法
作为开发者想必都清楚,多线程应用程序的开发为我们日常开发工作中提供了并发执行任务的能力,但线程死循环问题却是一个常见而令人头疼的挑战,因为线程死循环可能导致系统的不稳定性、资源浪费以及应用程序的异常运行,所以准确地定位和妥善处理线程死循环现象,并在编码阶段就避免潜在风险,成为开发人员必须面对的重要问题,线程死循环问题的解决不仅有助于提高系统的稳定性和可用性,还能优化资源利用和提升应用程序的性能,通过采取适当的预防和处理措施,开发人员能够避免线程陷入无尽的循环,并及时发现和解决潜在问题。那么本文就来分享一下关于如何处理线程死循环问题,以及如何在编码阶段规避潜在风险。
237 2
解决线程死循环问题的有效方法
|
7月前
|
安全 C语言 C++
奇怪的函数调用
奇怪的函数调用
62 0
|
7月前
避免循环死循环
避免循环死循环
57 0
|
4月前
|
存储 Java Spring
@Around 可以获取程序执行后的返回值吗
【8月更文挑战第13天】@Around 可以获取程序执行后的返回值吗
178 2
|
7月前
|
存储 安全
【汇编】在代码段使用数据,在代码段使用栈
【汇编】在代码段使用数据,在代码段使用栈
417 0
【汇编】在代码段使用数据,在代码段使用栈
|
7月前
|
NoSQL Shell C语言
GDB调试学习(一):单步执行和跟踪函数调用
GDB调试学习(一):单步执行和跟踪函数调用
162 1
在多线程中某段代码只执行一次
使用Automic包中的AtomicBoolean结合CAS来实现。当只希望需要某段代码在多线程中只执行一次的时候,此时你会发现boolean这个变量类型是多么有用。
141 0
|
编译器 C语言 C++
数组越界访问打印后为什么会陷入死循环
数组越界访问打印后为什么会陷入死循环
97 0
|
编译器 C++
有的编译器,for (i=1; i 《 1; i++)会执行循环体
有的编译器,for (i=1; i 《 1; i++)会执行循环体
74 0
|
前端开发 IDE Java
Java虚拟机学习:方法调用的字节码指令
通过一个实例将JVM方法调用的字节码指令逐个列出,一起来熟悉以下它们使用的场景
305 1
Java虚拟机学习:方法调用的字节码指令