試題以下:程序員
try {}裏有一個return 語句,那麼緊跟在這個try 後的ide
finally {}裏的code 會不會被執行,何時被執行,在return函數
前仍是後?測試
……code
……ip
但願不要早早看下面的解釋,本身想一下get
……源碼
……it
也許你的答案是在return 以前,但往更細地說,是在return 中間執行io
看源碼:
package dec;
/**
*
*
* <p>
* Title: try_catch_finally測試代碼 /p>
*
* <p>
* Description: 示例 業務類
* </p>
*
* <p>
* Copyright: Copyright (c) 2012
* </p>
*
*
* @author dml@2012-12-4
* @version 1.0
*/
public class TestTryCatchFinaly {
public static void main(String[] args) {
System.out.println("test1返回結果:" + new TestTryCatchFinaly()。test1());
}
int test1() {
int x = 1;
try {
System.out.println("try打印:" + x);
return x;
//這句編譯不經過
// System.out.println("try打印:" + x);
} finally {
++x;
System.out.println("finally打印:" + x);
}
}
}
以上程序運行結果:
try打印:1
finally打印:2
test1返回結果:1//運行結果是1,爲何呢?主函數調用子函數並獲得結果的過程,比如主函數準備一個空罐子,當子函數要返回結果時,先把結果放在罐子裏,而後再將程序邏輯返回到主函數。所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什麼結果可言,結果是在說這話以前放進罐子裏的。
明白了吧,先執行try中語句,而後遇到return時,將結果返回,接着執行finally中語句,後執行主函數語句。
接下來,看看這個函數:
public int test2() {
try {
return 1;
} finally {
return 2;
}
}
主函數中:
System.out.println("test2返回結果:" + new TestTryCatchFinaly()。test2());
應該打印結果是?
……
……
好好想一想
……
……
執行結果是:
test2返回結果:2
是否是有點暈了?不怕…
看看解釋怎麼說的:
try 中的return 語句調用的函數先於finally 中調用的函數執行,也就是說return 語句先執行,
finally 語句後執行,因此,返回的結果是2.Return 並非讓函數立刻返回,而是return 語
句執行後,將把返回結果放置進函數棧中,此時函數並非立刻返回,它要執行finally 語
句後才真正開始返回。
這會兒應該懂了吧,測試一下:
int test3() {
try {
return func1();
}
finally {
return func2();
}
}
int func1() {
System.out.println("func1被執行");
return 1;
}
int func2() {
System.out.println("func2被執行");
return 2;
}
主函數中:
System.out.println("test3返回結果:"+new TestTryCatchFinaly()。test3());
執行結果是?
……
……
func1被執行
func2被執行
test3返回結果:2
要是還不明白,看看上面的一句話
明白了吧,先執行try中語句,而後遇到return時,將結果返回,接着執行finally中語句,後執行主函數語句。
好好理解下
……
……
針對後面兩個示例,能夠這麼總結:
明白了吧,先執行try中語句,而後遇到return時,將結果返回,接着執行finally中語句,遇到return,將結果返回(也就是最後打印的結果),最後執行主函數語句。
p.s.程序的好處是不管何時都是肯定的,不肯定的只有程序員是否真的掌握了,不要把技術看的太難,也不能把技術看的太簡單,作對的事情要比把事情最對更重要。