结论:(个人见解,如果错误还望指正)
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.当try或catch块中有System.exit(0)语句时,finally块中的语句不会执行;
4.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的(针对primitive type或不可变对象入String);
5.finally块中可以包含return语句。
6.当遇到return后将返回值(非主业务类型为地址)保存到某一内存快(如栈),然后执行finally语句。假如finally改变了原返回对象,如果为可变对象,则栈中的值也随之改变,如果为不可变对象或主业务类型,栈中的值不会改变。
7.当finally中有return语句,则此返回值会覆盖原来保存在栈中的返回值
运行结果如下:
[quote]
try1: java
finally1: javaeye
main1: javaeye
try2:1
finally2:2
main2: 1
try3: cs
finally3: csdn
main3: cs
try4:1
finally4:2
main4: 2
[/quote]
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.当try或catch块中有System.exit(0)语句时,finally块中的语句不会执行;
4.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的(针对primitive type或不可变对象入String);
5.finally块中可以包含return语句。
6.当遇到return后将返回值(非主业务类型为地址)保存到某一内存快(如栈),然后执行finally语句。假如finally改变了原返回对象,如果为可变对象,则栈中的值也随之改变,如果为不可变对象或主业务类型,栈中的值不会改变。
7.当finally中有return语句,则此返回值会覆盖原来保存在栈中的返回值
public class Test {
public static void main(String[] args) {
System.out.println("main1: " + Test.test1().toString());
System.out.println();
System.out.println("main2: " + Test.test2());
System.out.println();
System.out.println("main3: " + Test.test3());
System.out.println();
System.out.println("main4: " + Test.test4());
}
static StringBuilder test1() {
StringBuilder sBuilder = new StringBuilder();
try {
sBuilder.append("java");
System.out.println("try1: " + sBuilder.toString());
return sBuilder;
} finally {
sBuilder.append("eye");
System.out.println("finally1: " + sBuilder.toString());
}
}
static int test2() {
int i = 1;
try {
System.out.println("try2:" + i);
return i;
} finally {
++i;
System.out.println("finally2:" + i);
}
}
static String test3() {
StringBuilder sBuilder = new StringBuilder();
try {
sBuilder.append("cs");
System.out.println("try3: " + sBuilder.toString());
return sBuilder.toString();
} finally {
sBuilder.append("dn");
System.out.println("finally3: " + sBuilder.toString());
}
}
static int test4() {
int i = 1;
try {
System.out.println("try4:" + i);
return i;
} finally {
++i;
System.out.println("finally4:" + i);
return i;
}
}
}
运行结果如下:
[quote]
try1: java
finally1: javaeye
main1: javaeye
try2:1
finally2:2
main2: 1
try3: cs
finally3: csdn
main3: cs
try4:1
finally4:2
main4: 2
[/quote]