文档章节

try,catch,finally的一点小疑惑

WilliamQ
 WilliamQ
发布于 2015/10/21 23:36
字数 737
阅读 15
收藏 0

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

代码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,因为这是没有意义的(至少我这样认为,你的代码将不会再有其他的输出。。。)。

© 著作权归作者所有

共有 人打赏支持
WilliamQ
粉丝 0
博文 5
码字总数 2267
作品 0
深圳
Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会...

passionfly
2015/04/18
0
0
异常处理遇到过的那些坑

今年有个目标之一就是提升团队代码的质量,所以时常会思索如何把这件事做到更好,不想教条主义,也不想搞出一个代码规范,强制团队照着做,落地的效果不好,反而把大家的积极性给弄没了。所以...

谢东升Forest
2017/07/27
0
0
关于 Java 中 finally 语句块的深度辨析

文章来自 IBM developerWorks 可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机。接下来我就带您一步一步的揭开这个 finally 的神秘面纱。 问题分析 首先来问大家一个...

IBMdW
2011/07/15
267
4
java 异常处理中finally语句块的一点小问题

package Ztest; public class Test {public static void main(String[] args) {ExceptionTest et = new ExceptionTest();System.out.println(et.test());}} class ExceptionTest{public int ......

kong_resty
2012/03/12
848
5
(转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)

原处:http://blog.csdn.net/ns_code/article/details/17485221 在这里看到了try catch finally块中含有return语句时程序执行的几种情况,但其实总结的并不全,而且分析的比较含糊。但有一点...

huwenchi111
2017/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学hadoop需要什么基础

最近一段时间一直在接触关于hadoop方面的内容,从刚接触时的一片空白,到现在也能够说清楚一些问题。这中间到底经历过什么只怕也就是只有经过的人才会体会到吧。前几天看到有个人问“学hadoo...

左手的倒影
32分钟前
1
0
LOADING Redis is loading the dataset in memory

Redis出现错误 LOADING Redis is loading the dataset in memory 原因1:redis中dump.rdb文件到达3G时,所有redis的操作都会抛出此异常。解决方法:redis.conf中 maxmemory 调大。 原因2:另...

swingcoder
32分钟前
0
0
闪屏页设置

相信每个app都需要一个闪屏页 就是一个开始页面 对于新手来说 可能就直接一个activity 弄个背景图片 ,细心地同学也许会发现 每次启动 应用程序的时候 一开始显示的不是那个设置的背景图片 ...

王先森oO
37分钟前
1
0
解析Excel

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import or......

开源中国封号找我
42分钟前
0
0
pandas不能在pycharm中使用plot()方法显示图像的解决方法

最近用了pycharm,感觉还不错,就是pandas中Series、DataFrame的plot()方法不显示图片就给我结束了,但是我在ipython里就能画图 以前的代码是这样的 import matplotlib.pyplot as pltfrom p...

kipeng300
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部