try/catch/finally語句下,finally子句是肯定會執行的。但是很多人做不同的測試,卻得出了不同的結論。
具體的原理最好是去看《深入java虛擬機》,里面對jsr、ret等幾個指令做了詳細的說明。這里不深入分析,而僅僅是從表現形式上看一下finally的特征。
代碼:
/*
* author: Zang XT
*/
public class TestFinal {
public static void main(String[] args) {
System.out.println("test1:" + testFinal1());
System.out.println("test2:" + testFinal2());
System.out.println("test3:" + testFinal3());
System.out.println("test4:" + testFinal4());
}
static int testFinal1() {
int i = 1;
try {
return i;
} finally {
System.out.println("in testFinal1():finally 肯定會被執行的!");
i = 48;
}
}
static String testFinal2() {
String str = "try";
try {
return str;
} finally {
System.out.println("in testFinal2():finally 肯定會被執行的!");
str = "finally";
}
}
static StringBuilder testFinal3() {
StringBuilder build = new StringBuilder("try ");
try {
return build;
} finally {
System.out.println("in testFinal3():finally 肯定會被執行的!");
build.append("finally");
build = new StringBuilder("你猜我是誰!");
}
}
static String testFinal4() {
try {
return "return in try";
} finally {
System.out.println("in testFinal4():finally 肯定會被執行的!");
return "return in finally";
}
}
}
輸出是:
in testFinal1():finally 肯定會被執行的!
test1:1
in testFinal2():finally 肯定會被執行的!
test2:try
in testFinal3():finally 肯定會被執行的!
test3:try finally
in testFinal4():finally 肯定會被執行的!
test4:return in finally