try,catch,finally的一点小疑惑
博客专区 > WilliamQ 的博客 > 博客详情
try,catch,finally的一点小疑惑
WilliamQ 发表于2年前
try,catch,finally的一点小疑惑
  • 发表于 2年前
  • 阅读 14
  • 收藏 0
  • 点赞 0
  • 评论 0

华为云·免费上云实践>>>   

摘要: 哈哈,这又是一道笔试题,主要是关于return和finally先后执行的问题的。。。总有那么一些小细节平时不会注意,到了遇到的时候才发现原来这里还不明白。

老规矩,先来看下这样两段代码的输出结果:

代码A:

public class TestA {

	public static void main(String[]args){		
		System.out.println(inc());
	}
	
	public static T inc(){
		T t = new T();
		try{
			t.a = 1;
			if(t.a == 1){
				throw new NullPointerException();
			}
			return t;
		}catch(Exception e){
			t.a = 2;
			return t;
		}finally{
			t.a = 3;
		}
	}
}

public class T{
	public int a = 4;
	public String toString(){
		return "T [a="+a+"]";
	}
}

代码B:

public class StaticTest {

	public static void main(String[]args){		
		System.out.println(inc());
	}
	
	public static Integer inc(){
		Integer a = 0;
		try{
			a = 1;
			if(a == 1){
				throw new NullPointerException();
			}
			return a;
		}catch(Exception e){
			a = 2;
			return a;
		}finally{
			a = 3;
		}
	}
}

以上的两段代码是完整的笔试代码:

代码A的结果是:T[a=3]

代码B的结果是:2

我在第一眼看到这个题目是,立即得出结果,

T[a=3]

3

为什么我会得出这样的结果呢?

因为我把return和finally的执行顺序搞乱了,以前一直以为,return的执行应该是最后一步,所以finally在return前先执行。这种想法当然是错误的,其实:

在整个try,catch,finally块中,finally自然应该是最后执行的,当try或者catch中已经有了return后,先执行return操作,然后执行finally,finally执行完成后再将之前的值return回去,随后执行的finally是不会影响到return的值的。

当我一个朋友看明白这里的说法后,马上就说:原来如此,那结果不就应该是:

T[a=2]

2

这当然是不正确的,正如我所说的finally的执行不会影响到return的值,所以代码A的返回自然是t对象没错。然而java中采用的是引用传递而非值传递,所以这里返回的只是t对象的引用,finally里面的代码虽然没有改变返回的引用值,确实改变了引用指向的对象的值。


讲到这里其实这个问题已经解决了,下面是我曾经关于try,catch,finally的几个小误解:

1.try和finally是必须一起使用的,但是catch块就可以去掉;

2.finally里面的内容并非一定会执行,当try块之前程序已经return,则不会执行try里面的内容,也不会执行到对应的finally里面的内容。当try块或catch块中存在:System.exit(0) 这时JVM被结束掉,程序自然没法继续往下执行;

3.finally语句是在try的return语句执行之后,return返回之前执行(这句是在前辈的总结中看到的,我觉得比我总结的好);

4.不要再finally里面使用return,因为这是没有意义的(至少我这样认为,你的代码将不会再有其他的输出。。。)。

标签: try catch finally return
共有 人打赏支持
粉丝 0
博文 4
码字总数 2207
×
WilliamQ
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: