有关Java异常处理中包含return语句的try和finally执行顺序的实证

本文探讨了Java中try-finally块的执行顺序,特别关注于对象销毁与return语句之间的交互。通过示例展示了finally块如何在return之前执行,确保对象被正确销毁,而不影响return语句的执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         依稀记得finally块的执行顺序是在try块的后面,但是是在try的return语句之前。然后试了一下。

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {

	try {
		System.out.println("try");
		return true;

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		System.out.println("finally");
	}
	return false;
}

 

果然打印结果为:

try
finally
true

 

        但是上午写代码的时候碰到个情况,try语句中最后要return一个值,return语句里面引用到一个对象,但是要在finally中清理掉这个对象,心想这要是按照上面的执行顺序,岂不是在return的时候就会报空指针的错误了,于是尝试了一下。

 

class C {
	int c = 100;

	int get() {
		return c;
	}
}

 

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {
	C c = null;
	try {
		c = new C();
		System.out.println("try");
		return (c.get() == 100);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		c = null;
		System.out.println(c);
		System.out.println("finally");
	}
	return false;
}

 

发现打印结果为:

try
null
finally
true

 

       可见finally确实在try块之后,try中return之前执行了,并且将对象变成null,但是貌似并没有影响try块中return语句的执行结果。表面上貌似跟上面第一个测试的结果相悖了。于是猜想是不是return语句执行结束之后,把执行的结果存放在某个地方了,等到finally执行完毕再把值取出,return出来。

 

       于是重新尝试在finally中return值

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {
	C c = null;
	try {
		c = new C();
		System.out.println("try");
		return (c.get() == 100);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		c = null;
		System.out.println(c);
		System.out.println("finally");
		return false;
	}
//		return false;
}

 

执行结果为

try
null
finally
false

        因为finally中的return语句,替换掉了在try中return保存的值。

        所以在finally中把对象进行销毁,是不用担心try中return语句的执行结果,因为这个结果在开始执行finally之前就已经保存下来了,只是在finally执行完毕之后重新取出之前保存的值,再return出来

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值