java中try、catch、finally语句块和return的执行顺序

java中try、catch、finally语句块的执行顺序

初学到try、catch、finally时我所记得的时:三者的顺序try语句块先执行,执行过程中如果遇到异常则转入catch语句块,最后执行finally语句块的内容。在不牵扯到return语句时这很好记。在加入到return语句时就有很多要注意的情况。
1.try中有return,没有catch,finally中没有return。

public class Test {
	public static void main(String[] args) {
		Test m = new Test();
		System.out.println("return i=" + m.amethod());
	}

	public int amethod() {
		int i = 0;
		try {
			i++;
			System.out.println("try i=" + i + " ");
			return ++i;
		} finally {
			// 2.finally一定会在return之前执行。(准确说,应该是return;语句)
			i++;
			System.out.println("finally i=" + i + " ");
		}
	}
}

执行结果:

try i=1 
finally i=3 
return i=2


这里先执行了try语句,i的值变为1,
然后执行了return语句,++i,i的值变为2,将要返回的值2保存起来, 继续执行finally语句,
在finally开始时i的值为2,执行后变为3
函数执行结束,将临时保存的值2返回。

public static void main(String[] args) {
		Test m = new Test();
		System.out.println("return i=" + m.amethod1());
	}
public int amethod1() {
		int i = 0;
		try {
			// 1,抛出异常,i=1

			i++;
			int x = i / 0;
			System.out.println("try return" + i + " ");
		} catch (Exception ex) {
			// 2.catch捕获异常,并执行
			i++;
			System.out.println("catch return  " + i + " "); 
			//3.执行++i; i变为3
			return ++i;
		} finally {
			// 4.finally一定会在return之前执行。(准确说,应该是return;语句)
			i++;
			System.out.println("finally return " + i + " ");
		}
		return 0;
	}

执行结果:

catch return  2 
finally return 4 
return i=3
public int amethod3() {
		return -1;
	}

	public int amethod2() {
		int i = 0;
		try {
			// 1,抛出异常

			i++;
			int x = i / 0;
			System.out.println("2try return" + i + " ");
		} catch (Exception ex) {
			// 2.catch捕获异常,并执行
			i++;
			System.out.println("2catch return  " + i + " "); 
			//3.执行amethod1();,结果保存下来,等待finally执行完毕之后返回
			return amethod1();
		} finally {
			// 4.finally一定会在return之前执行。(准确说,是函数执行完毕,将返回值返回)
			i++;
			System.out.println("2finally return " + i + " ");
			//5.执行return i, i的值覆盖掉第三步保存下来的值并将i返回
			return i;
		}
	}

执行结果:

2catch return  2 
2finally return 3 
return i=3

总结
在不产生异常的情况下,try语句块执行和catch语句块相似
执行顺序:
1.try/catch语句块(不包含return语句)
2.return语句(执行要返回的语句,得出返回值,并临时保存下来
3.执行final语句,如果没有return语句,执行完成后,函数返回之前保存的结果
如果有return语句,finally语句块的return值将覆盖之前保存的值并返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值