Java中try-catch-finally含return语句的执行情况

在Java中,

    1、如果try语句中有return,那么finally语句(没有return)是否执行?  执行。

    2、如果try语句,finally语句块中都有return,怎样执行?

    从try->catch->finally依次执行(如果异常执行catch),并返回最后一次return的结果。

    3、如果try语句中有return而finally语句中没有,finally中代码是否会影响try中return返回值的结果? 不会

情况一:

public class Function {
	public static void main(String[] args) {
		Function fun = new Function();
		System.out.println(fun.fun());
	}

	public int fun() {
		int result;
		try {
			System.out.println("try语句块");
			result = 1;
			return result;
		} catch (Exception e) {
			System.out.println("catch语句块");
			return 2;
		} finally {
			result=3;
			System.out.println("finally语句块");
			//return 3;
		}
	}
}

上面代码的执行结果是:

try语句块
finally语句块
1

这里执行了finally语句,result的值已经被改变为了3。但是这里注意,在try语句中执行return返回的result没有被立刻返回,因为它还没有执行完程序,没有执行finally语句。

所以,此时try语句中return的值会生成一个副本(暂且将它叫做result1),result1(这个副本)被存放在一个临时栈中。这就意味着存放的result1(副本)区别于还在执行程序中的result。result在finally语句中执行时,不会影响finally1(副本)的值。而当finally语句执行完,才会将临时栈中的result1(副本)的值返回。

所以程序结束时,虽然result的值已经被改变为3。但是执行try语句时已经将result=1生成存入临时栈,不会被后面result值得改变影响。故最终的返回值为临时栈中副本的值,为1 。

情况二:

public class Function {
	public static void main(String[] args) {
		Function fun = new Function();
		System.out.println(fun.fun());
	}

	public int fun() {
		int result;
		try {
			System.out.println("try语句块");
			result = 1;
			return result;
		} catch (Exception e) {
			System.out.println("catch语句块");
			return 2;
		} finally {
			result=3;
			System.out.println("finally语句块");
			return 3;
		}
	}
}

上面代码执行结果:

try语句块
finally语句块
3

这里我们可以看到,仅仅是在finally语句中增加了return,最后返回的是finally中return的值。这说明finally中ruturn返回值会将之前存在临时栈中的值(例如情况一中的result1(副本))覆盖,所以最后返回finally语句中的return。

在这里可以理解为,顺序执行,并返回最后一次return的结果。

情况三:

public class Function {
	public static void main(String[] args) {
		Function fun = new Function();
		System.out.println(fun.fun());
	}

	public int fun() {
		int result;
		try {
			System.out.println("try语句块");
			result = 12/0;
			return 1;
		} catch (Exception e) {
			System.out.println("catch语句块");
			return 2;
		} finally {
			result=3;
			System.out.println("finally语句块");
			//return 3;
		}
	}
}

上述代码执行结果:

try语句块
catch语句块
finally语句块
2

当正常的捕获异常时,代码运行的顺序就是try->catch->finally依次执行,并最终返回return的值。

由上述三种情况我们可以推断出情况四,当捕获异常,并且finally中有return时,代码会try->catch->finally依次执行,最终返回finally中return的值。

其他情况还没有遇到,遇到后会及时补充。

最后不足的地方希望大家指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值