`
codecook
  • 浏览: 41975 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

finally结构的注意点(一)

阅读更多
我们知道,try-catch-finally结构和try-finally结构是用来捕获异常的典型结构。
而finally结构的作用,通常是在catch结构中抛出异常时做一些清理工作(如释放资源)。
然而有3个典型的问题,可能会影响我们对finally作用的判断。

第一个问题:如果在catch结构中抛出异常,finally结构是否会被执行?
代码如下:
	/**
	 * 测试:如果在catch结构中抛出异常,finally结构是否会被执行。 结果:会被执行。
	 * 
	 * @throws Exception
	 */
	public static void testThrowExceptionInCatch() throws Exception {
		try {
			throw new Exception();
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("finally");// execute this line;
		}
	}

通过执行testThrowExceptionInCatch()函数,我们知道,finally是会执行的。(catch结构也产生了副作用,抛出的异常会覆盖try中抛出的异常)

第二个问题:如果在finally结构中抛出异常,那这个异常会不会覆盖try-catch结构中抛出的异常?
代码如下:
	/**
	 * 测试:如果在finally结构中抛出异常,那这个异常会不会覆盖try-catch结构中抛出的异常。 结果:会覆盖。
	 * 
	 * @throws Exception
	 */
	public static void testThrowExceptionInFinally() throws Exception {
		try {
			throw new Exception();
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("start finally");
			throw new Exception();
		}
	}

通过执行testThrowExceptionInFinally()函数,发现finally结构中抛出异常覆盖了try-catch结构中抛出的异常。

第三个问题:如果在finally结构中有return语句,那这个返回值会不会覆盖try-catch结构中的返回值?
代码如下:
	/**
	 * 测试:如果在finally结构中有return语句,那这个返回值会不会覆盖try-catch结构中的返回值。 结果:会覆盖。
	 * 
	 * @return
	 * @throws Exception
	 */
	public static int testReturnValueInFinally() throws Exception {
		try {
			return 1;
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("finally");
			return 2;// 覆盖返回值
		}
	}

通过执行testReturnValueInFinally()函数,返回值为2,可见finally结构中的return语句覆盖了try-catch结构中的返回值。

可见,finally除了做一些清理工作外,如果运用不当,也是会产生副作用的。
分享到:
评论

相关推荐

    Python异常处理机制结构实例解析

    首先,Python 完整的异常处理语法结构如下: ...注意,在整个异常处理结构中,只有 try 块是必需的,也就是说: 如果没有 try 块,则不能有后面的 except 块、else 块和 finally 块。但是也不能只使用 try 块,要

    c#学习笔记.txt

    尽管可能将一个点表示为类,但结构在某些方案中更有效。在一些情况下,结构的成本较低。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。结构可以声明构造函数,但它们必须带参数。...

    JAVA面试题最全集

    第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的...

    超级有影响力霸气的Java面试题大全文档

    finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep...

    java 面试题 总结

    finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep()...

    二十三种设计模式【PDF版】

    因为很多人没有注意到这点,学完 Java 基础语言就直接去学 J2EE,有的甚至鸭子赶架,直接使用起 Weblogic 等具体 J2EE 软 件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解 J2EE 了吗?你在具体案例中的...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址, 而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。 1.8.4 对象的引用 对象的使用包括引用对象的成员变量和方法,...

    毕业设计——流媒体视频直播服务器(Java + MySQL + FFmpeg + RTSP + RTP).zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    毕业设计基于Cesium时空数据可视化后台Java SSM框架.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    本科毕业设计项目-Java电影推荐系统-管理后台.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    毕业设计管理系统java服务端,采用spring mvc.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    毕业设计-->物流管理系统的设计与实现(java).zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    超市供销存管理系统,超市管理系统,供销存管理系统,进销存,JAVA+MySQL毕业设计.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    毕业设计---基于java的软件资源库的实现(后端).zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    基于Vue的电影在线预订与管理系统-后台java代码(ssm)(毕业设计).zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    毕业设计,关于新浪微博API的Java编程..zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    基于java的校园二手交易系统毕业设计.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    基于Java Web的智能二维码门禁管理系统(本科毕业论文+毕业设计).zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

    使用Spring Boot的小型诊所信息系统,毕业设计Java版.zip

    对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...

Global site tag (gtag.js) - Google Analytics