文档章节

try,catch,finally的一点小疑惑

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

码上生花,ECharts 作品展示赛正式启动!>>>

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

代码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

WilliamQ

粉丝 0
博文 7
码字总数 2996
作品 0
深圳
私信 提问
加载中
请先登录后再评论。
Java finally语句到底是在return之前还是之后执行

看过网上关于Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行的讨论也有很多。 首先明确一点,下面两种情况finally肯定是不执行的: 1). return语句在try之前,还...

osc_eeik3xla
2018/07/23
2
0
JAVA中try、catch、finally带return的执行顺序总结

  异常处理中,try、catch、finally的执行顺序,大家都知道是按顺序执行的。即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→finally。但是当try、c...

PC君
2019/06/03
0
0
Eclipse用法和技巧:自动添加try/catch块

站在编译器的角度来看,java中的异常可以分为两种,已检查异常和未检查异常。对于已检查异常比如IO操作,编译器会要求设置try/catch语句块,在eclipse中也只要使用帮助快捷键ctrl+1,就可以自...

osc_tf30cc36
2018/09/08
1
0
面试再也不怕 try catch finally 了

try catch finally 三兄弟 一、try:   一旦产生异常,则系统会自动产生一个异常类的实例化对象。当我们觉得该语句会发生异常时,我们就放到try{ }中。 二、catch:   当我们的try{ }中发...

南擘汪
05/11
0
0
Try-Catch-Finally语句块执行问题

Try-Catch-Finally语句块执行问题 记录一个今天某公司的面试问题,其实我问题回答对了,但是面试官问我动手验证过没有,这还真没有,纯理论,被怼惨了,希望自己能变得更强大。 Try-Catch-Fi...

osc_9ow0lf0i
2019/09/19
2
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis之foreach用法

在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item,index,collection,ope...

osc_0hs26yvj
38分钟前
3
0
css笔记整理

0索引 1html标签块 2选择器 3CSS的引入方式: 4CSS浮动 :流式布局 5盒子模型 6案例一网站首页 7案例二网站注册页面 1html标签块 div标签:默认占- -行,自动换行 span标签:内容显示在同- -行 <!...

osc_3grma05a
39分钟前
5
0
js获取图片的EXIF,解决图片旋转问题

相信大家在做项目的时候会遇到在canvas里加入图片时,图片发生90°,180°的旋转。当时的你肯定时懵逼的,为毛。 其实这就是图片的EXIF搞的鬼。 什么是EXIF 简单来说,Exif 信息就是由数码相...

osc_ytmgp8ea
40分钟前
10
0
StringUtils.isEmpty()和isBlank()的区别

一、概述 两种判断字符串是否为空的用法都是在程序开发时常用的,相信不少同学在这种简单的问题上也吃过亏,到底有什么区别,使用有什么讲究,带着问题往下看。 二、jar包 commons-lang3-3....

osc_1mofhvr6
42分钟前
11
0
H5嵌入钉钉

1,需要在项目种引入钉钉官方的js <script type="text/javascript" src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.3.0/dingtalk.open.js" ></script> 或者npm 也可以的 2,钉钉......

osc_ucqb2u3q
43分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部