try catch finally执行顺序_一个简单的程序执行

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

e612628c2ec7de8836475b96d22717a6.png

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

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

  1.  try-catch-finally

  2. try-catch

  3. try-finally

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

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

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

9a3898058f23185ce6e7275018ec12a0.png

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

总结:

  1.  finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。

  2. 如果在catch中return了,也会在return之前,先执行finally代码块

  3. 而且如果finally代码块中含有return语句,会覆盖其他地方的return。

  4. 对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。

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

深入研究执行的顺序

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

e451525e5b6b71605c9b8f83a5ce4a57.png

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

0f35f34ced073f65ea661e9386c8316f.png

finally里面的执行不会影响,return的返回

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

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

d6127ce5a0f66e08a906263f4e3a9135.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值