问题重现
先来看一下以下的代码,猜猜他们会是什么样的结果:
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贴出来有问题,就是随便给你截断了,郁闷!!