文档章节

try,catch,finally的一点小疑惑

WilliamQ
 WilliamQ
发布于 2015/10/21 23:36
字数 737
阅读 15
收藏 0
点赞 0
评论 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
博文 4
码字总数 2207
作品 0
深圳
Java finally语句与return语句执行顺序解析

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

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

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

谢东升Forest
2017/07/27
0
0
(转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)

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

huwenchi111
2017/01/13
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
关于IO流的一点小问题

public class Demo6{ public static void main(String[] args) { write(); } private static void write() { OutputStream out=null; DataOutputStream dout=null; File file= new File("src......

kong_resty
2012/03/15
154
5
揭开JVM所看到的try/catch/finally

揭开JVM所看到的try/catch/finally 最近有一位朋友发了一段代码给我,这个方法很简单,具体内容大致如下: 上面代码可以看到是通过执行该循环体所消耗的时间,通过和把注释掉进行对比,最后得...

Bieber
2016/06/30
160
0
使用try-with-resources替代try finally释放资源

1、旧社会 Java里,对于文件操作IO流、数据库连接等开销非常昂贵的资源,用完之后必须及时通过close方法将其关闭,否则资源会一直处于打开状态,直至程序停止,增加系统负担。 关闭资源的常用...

苗新国
2016/06/27
21
0
java异常小结

一、java中异常的分类: 1.Error 当程序发生不可控的错误时,通常做法是通知用户并中止程序的执行。与异常不同的是Error及其子类的对象不应被抛出。 Error是throwable的子类,代表编译时间和...

hello菜bird
2016/09/02
44
0
Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...el...

长平狐
2012/11/12
77
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
17分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
12
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
203
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部