问题重现
先来看一下以下的代码,猜猜他们会是什么样的结果:
public class FinallyIssue {
public static void main(String[] args) {
System.out.println("finallyReturnTest : ");
System.out.println("return value : " + finallyReturnTest(1));
System.out.println("return value : " + finallyReturnTest(-1));
System.out.println("finallyBreakTest : ");
System.out.println("return value : " + finallyBreakTest(true));
System.out.println("return value : " + finallyBreakTest(false));
System.out.println("valueChangeInFinallyTest : ");
System.out.println("return value : " + valueChangeInFinallyTest());
System.out.println("valueChangeReturnInFinallyTest : ");
System.out.println("return value : " + valueChangeReturnInFinallyTest());
System.out.println("refValueChangeInFinallyTest : ");
System.out.println("return name : " + refValueChangeInFinallyTest().name);
}
private static boolean finallyReturnTest(int value) {
try {
if(value > 0) {
return true;
} else {
return false;
}
} finally {
return false;
}
}
private static boolean finallyBreakTest(boolean value) {
while(value) {
try {
return true;
} finally {
break;
}
}
return false;
}
private static int valueChangeInFinallyTest() {
int i = 10;
int j = 1;
try {
i = 100;
j = 2;
System.out.println("try : i = " + i);
System.out.println("try : j = " + j);
return i;
} catch(Exception e) {
e.printStackTrace();
} finally {
i = 1000;
j = 3;
System.out.println("finally : i = " + i);
System.out.println("finally : j = " + j);
}
return i;
}
private static int valueChangeReturnInFinallyTest() {
int i = 10;
int j = 1;
try {
i = 100;
j = 2;
System.out.println("try : i = " + i);
System.out.println("try : j = " + j);
return i;
} catch(Exception e) {
e.printStackTrace();
} finally {
i = 1000;
j = 3;
System.out.println("finally : i = " + i);
System.out.println("finally : j = " + j);
return i;
}
}
private static Person refValueChangeInFinallyTest() {
Person p = new Person();
try {
p.name = "person1";
System.out.println("try : Person name is : " + p.name);
return p;
} catch(Exception e) {
e.printStackTrace();
} finally {
p.name = "person2";
System.out.println("finally : Person name is : " + p.name);
}
p.name = "person3";
System.out.println("out : Person name is : " + p.name);
return p;
}
static class Person {
public String name;
}
}
这样一段代码的结果会是什么呢?
以下是运行结果:
finallyReturnTest :
return value : false
return value : false
finallyBreakTest :
return value : false
return value : false
valueChangeInFinallyTest :
try : i = 100
try : j = 2
finally : i = 1000
finally : j = 3
return value : 100
valueChangeReturnInFinallyTest :
try : i = 100
try : j = 2
finally : i = 1000
finally : j = 3
return value : 1000
refValueChangeInFinallyTest :
try : Person name is : person1
finally : Person name is : person2
return name : person2
这个结果很出乎我的意料,我们知道finally总是会在try-catch语句块执行完后执行,不管try语句块中是否已经返回或者抛出了异常。
但是在上面的代码测试中,如果finally语句块中有return、break、continue等语句,那么它们会覆盖try语句块中的return、break、continue的语句,如以上的finallyReturnTest()、finallyBreakTest()、valueChangeReturnInFinallyTest()三个函数。
另外,如果在finally语句块中修改要返回的值类型变量的值,则这些修改不会保存下来,如valueChangeInFinallyTest()函数;如果要返回的值是引用类型,则修改引用类型的内部成员的值会保存下来。
如何解释这个结果呢?
结果解释在下一篇中给出。javaeye中发表长一点的文章实在是太差了,不是word贴出来有问题,就是随便给你截断了,郁闷!!
分享到:
相关推荐
经过教学实践发现,学生对于异常的掌握通常停留在使用try-catch-finally语句捕获异常的水平上,对于异常内部机制及自定义异常的了解较少。这种情况往往导致学生在实际编程中对异常处理的应用不够灵活,对自定义异常...
Java使用try-catch-finally语句块来捕获和处理异常。try块中包含可能会抛出异常的代码,catch块用来捕获并处理特定类型的异常,finally块确保无论是否发生异常,某些代码(如资源释放)总能得到执行。通过使用异常...
9. **错误处理**:.NET使用try-catch-finally语句块处理异常。`try`块中捕获异常,`catch`块处理异常,`finally`块确保即使发生异常也能执行的清理代码。 10. **using关键字**:用于确保资源在使用后得到正确释放,...
1. 异常概述:介绍Java异常处理机制,包括异常类层次结构和try-catch-finally语句块的使用。 2. 自定义异常:讲解如何创建自定义异常类以及何时使用它们。 四、集合框架 1. 数组列表(ArrayList)与链表...
3. **异常处理**:Java有强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,提高程序的健壮性。 4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们提供了...
4. **异常处理**:Java提供了一种强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。理解何时抛出异常,如何编写自定义异常,以及如何有效地使用异常处理,是编写健壮Java代码的必要技能。 ...
10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 284 10.5.1 神秘的Class类 284 10.5.2 覆盖不再神秘 285 10.5.3 instanceof运算符——让...
4. **异常处理**:理解如何使用try-catch-finally语句块,以及不同类型的异常类,有助于编写健壮的代码。 5. **IO流与NIO**:输入输出流的理解和使用,包括文件操作、网络通信等,以及Java NIO(非阻塞I/O)的概念...
通过try-catch-finally语句块,程序员可以捕获并处理运行时可能出现的错误,确保程序的正常运行。 3. **集合框架**:Java集合框架是存储和管理对象的重要工具,包括List、Set、Queue和Map接口,以及ArrayList、...
10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 284 10.5.1 神秘的Class类 284 10.5.2 覆盖不再神秘 285 10.5.3 instanceof运算符——让...
Python的异常处理语句提供了else块和finally块,它们在异常处理中有特定的用途。 ```python try: put_***_volts_through_it(parrot) except Voom: print("'E'spining!") else: print("This parrot is no more!")...
- 使用`try-catch-finally`语句块捕获和处理异常。 - 熟悉`Exception`类层次结构,了解常见异常类。 5. **集合框架** - 理解ArrayList、LinkedList、HashSet、HashMap等容器的内部原理和使用场景。 - 掌握List...
lock 关键字将某个语句块标记为临界区。 6. 方法参数 如果为没有 ref 或 out 的方法声明一个参数,则此参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数...
在C#中,可以使用try、catch和finally语句处理运行时的错误,提高程序的健壮性。 编码风格和约定: C#具有明确的编码风格和约定,比如变量命名规则、使用匿名类型以及对编译器生成的异常的处理。遵循一致的编码标准...
例如,`abstract`用于声明抽象类,`const`虽然在Java中未被使用,但在其他语言中表示常量,`finally`确保代码块无论如何都会执行,`int`是基本数据类型之一,代表整数。`this`引用当前对象,`throw`用于抛出异常,`...
3. **异常处理**: Java 异常处理是程序健壮性的重要组成部分,涉及到try-catch-finally块和异常类的使用。实训代码会展示如何正确捕获和处理运行时错误,确保程序在遇到问题时能有优雅的退出方式。 4. **集合框架**...