try/catch/finally語(yǔ)句下,finally子句是肯定會(huì)執(zhí)行的。但是很多人做不同的測(cè)試,卻得出了不同的結(jié)論。
具體的原理最好是去看《深入java虛擬機(jī)》,里面對(duì)jsr、ret等幾個(gè)指令做了詳細(xì)的說(shuō)明。這里不深入分析,而僅僅是從表現(xiàn)形式上看一下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 肯定會(huì)被執(zhí)行的!");
i = 48;
}
}
static String testFinal2() {
String str = "try";
try {
return str;
} finally {
System.out.println("in testFinal2():finally 肯定會(huì)被執(zhí)行的!");
str = "finally";
}
}
static StringBuilder testFinal3() {
StringBuilder build = new StringBuilder("try ");
try {
return build;
} finally {
System.out.println("in testFinal3():finally 肯定會(huì)被執(zhí)行的!");
build.append("finally");
build = new StringBuilder("你猜我是誰(shuí)!");
}
}
static String testFinal4() {
try {
return "return in try";
} finally {
System.out.println("in testFinal4():finally 肯定會(huì)被執(zhí)行的!");
return "return in finally";
}
}
}
輸出是:
in testFinal1():finally 肯定會(huì)被執(zhí)行的!
test1:1
in testFinal2():finally 肯定會(huì)被執(zhí)行的!
test2:try
in testFinal3():finally 肯定會(huì)被執(zhí)行的!
test3:try finally
in testFinal4():finally 肯定會(huì)被執(zhí)行的!
test4:return in finally