finally代码块一般是和try、catch代码块一块使用的。但是一般什么时候执行呢???先看一段代码吧。
package T1;
import java.util.*;
public class A {
private int i;
public int f() {
try {
return ++i;
}catch(Exception e) {
return 100;
}finally {
System.out.println("你好呀!");
}
}
public static void main(String[] args) {
System.out.println(new A().f());
}
}
这段代码执行的结果是:
你好呀!
1
从运行结果可以看出,finally会在try块中的return语句执行前执行的。如果在finally中含有return语句,那么try中的语句将不再执行,因为我们知道一个函数一旦return,那么这个函数将被销毁,其他的将不被执行。这种很简单,将不再粘贴代码。
在finally中改变变量的值是否对最终函数返回的变量的值是否有影响呢???答案是不一定!因为变量有基本类型的变量,有引用类型的变量。基本数据类型的变量在finally中改变,不会对返回值产生影响,但是引用型的变量将会产生影响。可以参照下面的代码进行分析
package T1;
import java.util.*;
public class A {
private int i;
private StringBuffer sb=new StringBuffer("Hello");
public int f1() {
try {
return ++i;
}catch(Exception e) {
return 100;
}finally {
i=10;
}
}
public StringBuffer f2() {
try {
return sb;
}catch(Exception e) {
return null;
}finally {
sb.append(" world!");
}
}
public static void main(String[] args) {
System.out.println(new A().f1());
System.out.println("/分界线呀!");
System.out.println(new A().f2());
}
}
1
/分界线呀!
Hello world!
运行结果如上。
finally真的一定会执行吗?答案是否定的,如果try块没有被执行(也就是说在try块之前程序已经异常退出),或者在try块中执行了System.exit(0);,都将导致finally不会被执行。