一个简单的程序执行

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

正文


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


相关文章
|
11天前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
9月前
|
调度
在 代码运行前加 strace 可以查看函数调度进程
在 代码运行前加 strace 可以查看函数调度进程
|
4月前
|
存储 安全
【汇编】在代码段使用数据,在代码段使用栈
【汇编】在代码段使用数据,在代码段使用栈
【汇编】在代码段使用数据,在代码段使用栈
|
4月前
|
NoSQL Shell C语言
GDB调试学习(一):单步执行和跟踪函数调用
GDB调试学习(一):单步执行和跟踪函数调用
54 1
|
8月前
|
存储 Java 编译器
JVM调用指令
JVM调用指令
51 0
|
10月前
在多线程中某段代码只执行一次
使用Automic包中的AtomicBoolean结合CAS来实现。当只希望需要某段代码在多线程中只执行一次的时候,此时你会发现boolean这个变量类型是多么有用。
82 0
使用注释来阻止程序执行
使用注释来阻止程序执行
56 0
线程 - 这段危险代码90%的人都写过!
线程 - 这段危险代码90%的人都写过!
81 0
线程 - 这段危险代码90%的人都写过!
Java多线程-程序运行堆栈分析
class文件内容 class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。 JVM运行时数据区 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁 方法区 JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。
935 0
|
调度
线程调度之多线程循环打印ABCABC
参考: https://blog.csdn.net/qq_32655383/article/details/51660925 但是我有点看不明白,于是就自己改写了下,后面分析。线程类: package threadabc; public class ThreadPrint implements ...
1214 0