直接以代碼爲例說明:
@Slf4j
public class Demo {
public Demo() {
}
public int method() {
int a = 10;
try {
int b = 10 / 0;
return b;
} catch (Exception e) {
log.info("進入catch語句.....");
a = 20;
return a;
} finally {
/*finally中的代碼主要是釋放資源*/
log.info("進入finally語句.....");
a = 30;
/*return a; 這種寫法是錯誤的!!*/
}
}
}
@Slf4j
public class CatchException {
public static void main(String[] args){
Demo d = new Demo();
System.out.println(d.method());
}
}
程序運行結果:
進入catch語句.....
進入finally語句.....
20
分析:
從結果可以看出,finally中代碼被執行了,但是爲什麼返回20,而不是返回30?
當程序執行到try中輸出語句,會產生異常,被catch捕捉到,a=20執行,在執行return時,return 先建立好一個返回路徑,把a=20打包好,然後執行finally中的代碼,a=30被執行了,但是return的返回路徑已確定,所以不會返回30,finally中的代碼主要是釋放資源,
執行a=30這種代碼沒有意義,在執行玩finally代碼後,最後按照return的返回路徑返回。如果在finally中寫上return,會覆蓋掉之前在catch中的返回路徑,直接返回30,但是這樣寫前邊try和catch就沒有任何意義了,程序最終就會返回finally中return,所以這種寫法是錯誤的。