try-catch-finally 执行顺序及return结果

try块中包括的是不稳定的代码块。
当try块中的代码抛出异常的时候,catch块捕获异常并进行相应的处理。
无论try块中是否有异常,finally块都一定会执行,但可以没有finally块。


本文为了探究try-catch-finally的执行顺序及return结果,在案例中为了理解,只涉及简单的变量值的改变。

首先看一个例子:

	int checkReturn1() {
		int num=1;
		try {
			return ++num;
		} catch (Exception e) {
			return ++num;
		} finally {
			num=10;
			num=20;
		}
	}

以上方法返回值是2,说明finally块对变量的修改对try块中没有影响。在执行finally块之前,会先将return的值存储起来,等到finally块执行完毕,再将原来存储的值进行返回,所以无论在finally块中如何修改变量值,返回的值都是原先try块中确定的值。


那么如果在finnally块中也有return的语句呢?

	int checkReturn2() {
		int num=1;
		try {
			return ++num;
		} catch (Exception e) {
			return ++num;
		} finally {
			num=10;
			return ++num;
		}
	}

以上方法返回结果是11,说明程序返回的是finally块中的return语句,因此当finally块中有return语句的时候,会直接在finally就执行return操作了,而不会返回try块中执行return语句。


如果有异常呢?我们制造一个简单的除零异常

	int checkReturn3() {
		int num=1;
		try {
			num=1/0;
			num=100;
			return ++num;
		} catch (Exception e) {
			return num+10;
		}
	}

以上方法运行结果为11,说明try块中出现异常后的语句并不会执行,包括return语句。


finally块和catch块中都有return语句那么以谁为标准?

	int checkReturn4() {
		int num=1;
		try {
			num=1/0;
			return ++num;
		} catch (Exception e) {
			num=num+10;
			return num;
		} finally {
			num=num+100;
			return num;
		}
	}

以上方法执行结果为111,说明最终执行的是finally块的return语句,且catch块中对变量的修改实际的影响了程序。


通过上述例子可以得出:只要finally块中有return语句,执行的就是finally块中的return;如果finally块中没有return语句,无论是否有异常,finally块中对返回变量的修改都不会生效,实际的返回值还是try块或catch块中未执行finally块中的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值