千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

在Java語言的異常處理中,finally塊的作用就是為了保證無論出現(xiàn)什么情況,finally塊里的代碼一定會被執(zhí)行。
由于程序執(zhí)行return就意味著結(jié)束對當前函數(shù)的調(diào)用并跳出這個函數(shù)體,因此任何語句要執(zhí)行都只能在return前執(zhí)行(除非碰到exit函數(shù)),因此finally塊里的代碼也是在return之前執(zhí)行的。
此外,如果try-finally或者catch-finally中都有return,那么finally塊中的return將會覆蓋別處的return語句,最終返回到調(diào)用者那里的是finally中return的值。
面試題舉例:在finally塊中改變基本數(shù)據(jù)類型、引用類型對比。
?public class Test{
public static int testFinally1(){
int result = 1;
try {
result = 2;
return result;
} catch (Exception e) {
return 0;
}finally{
result = 3;
System.out.println("execute finally1");
}
}
public static StringBuffer testFinally2(){
StringBuffer s = new StringBuffer("Hello");
try {
return s;
} catch (Exception e) {
return null;
}finally{
s.append(" World");
System.out.println("execute finally2");
????????????????}
}
public static void main(String[] args){
// 測試基本數(shù)據(jù)
int result = testFinally1();
System.out.println(result);
//測試引用數(shù)據(jù)類型
StringBuffer resultRef = testFinally2();
System.out.println(resultRef);
}
}
運行結(jié)果:
execute finally1
2
execute finally2
Hello World
?結(jié)果解釋:程序在執(zhí)行到return時會首先將返回值存儲在一個指定的位置,其次去執(zhí)行finally塊,最后再返回。在方法testFinally1中調(diào)用return前,先把result的值1存儲在一個指定的位置,然后再去執(zhí)行finally塊中的代碼,此時修改result的值將不會影響到程序的返回結(jié)果。
testFinally2中,在調(diào)用return前先把s存儲到一個指定的位置,由于s為引用類型,因此在finally中修改s將會修改程序的返回結(jié)果。
?
拓展:出現(xiàn)在Java程序中的finally塊是不是一定會被執(zhí)行?
答案:不一定。
下面給出兩個finally塊不會被執(zhí)行的例子:
(1)、當程序進入try塊之前就出現(xiàn)異常時,會直接結(jié)束,不會執(zhí)行finally塊中的代碼。
(2)、當程序在try塊中強制退出時也不會去執(zhí)行finally塊中的代碼,示例如下:
例如try塊中通過調(diào)用System.exit(0)強制退出了程序,因此導(dǎo)致finally塊中的代碼沒有被執(zhí)行。