我们知道,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 完整的异常处理语法结构如下: ...注意,在整个异常处理结构中,只有 try 块是必需的,也就是说: 如果没有 try 块,则不能有后面的 except 块、else 块和 finally 块。但是也不能只使用 try 块,要
尽管可能将一个点表示为类,但结构在某些方案中更有效。在一些情况下,结构的成本较低。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。结构可以声明构造函数,但它们必须带参数。...
第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的...
finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep...
finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep()...
因为很多人没有注意到这点,学完 Java 基础语言就直接去学 J2EE,有的甚至鸭子赶架,直接使用起 Weblogic 等具体 J2EE 软 件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解 J2EE 了吗?你在具体案例中的...
向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址, 而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。 1.8.4 对象的引用 对象的使用包括引用对象的成员变量和方法,...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...
对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和...