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

1 try中有return,finally中没有return
public class Test {
	public static void main(String[] args) {
		System.out.println("main :" + test());
	}
	public static int test() {
		int num = 1;
		try {
			System.out.println("try");
			return num += 10;
		} catch (Exception e) {
			System.out.println("catch");
		} finally {
			System.out.println("num:" + num);
			System.out.println("finally");
		}
		return num;
}

结果为:

2 try和finally中均有return
public class Test {
	public static void main(String[] args) {
		System.out.println("main :" + test());
	}
	public static int test() {
		int num = 1;
		try {
			System.out.println("try");
			return num += 10;
		} catch (Exception e) {
			System.out.println("catch");
		} finally {
			System.out.println("num:" + num);
			System.out.println("finally");
			return 100;
		}
	}
}
结果为:

3 (1)finally中改变返回值num(基本类型)
public class Test {
	public static void main(String[] args) {
		System.out.println("main :" + test());
	}
	public static int test() {
		int num = 1;
		try {
			System.out.println("try");
			return num += 10;
		} catch (Exception e) {
			System.out.println("catch");
		} finally {
			System.out.println("num:" + num);
			System.out.println("finally");
			num=100;
		}
		return num;
	}
}



结果为:
(2)finally中改变返回值num(引用类型)
public class Test {
	public static void main(String[] args) {
		System.out.println("main :" + test().num);
	}
	public static Number test() {
		Number number = new Number();
		String string = new String("aaa");
		try {
			System.out.println("try");
			return number;
		} catch (Exception e) {
			System.out.println("catch");
		} finally {
			System.out.println("number:" + number.num);
			System.out.println("finally");
			number.num = 100;
		}
		return number;
	}
}
class Number {
	public int num = 1;
}
结果为:

对于含有return语句的情况,这里我们可以简单地总结如下:

try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
1)如果return的数据是基本数据类型,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

其实,在try中的语句执行完成后,会放在一个临时的区域中,finally语句中执行完成后再执行try语句块中return操作,如果finally中没有执行return try中的值,即使修改了try中的基本类型值,也不影响try中return的值,修改的是引用类型的值,则影响该对象的值,如果finallly中执行了return try中的值,则finally中的值直接覆盖了try中的值返回





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值