我們都知道在try-catch-finally中,try塊先執行,如果捕獲到異常,則執行catch塊,如果沒有捕獲到異常,那麼catch塊始終不執行,在catch塊執行完之後,finally塊最後執行。
則那麼問題來了(假設都沒有捕獲異常)
1,如果try塊中有return語句,那麼finally會執行嗎?
答案:會(實踐在後面)
2,如果finally塊中改變了try塊中的return語句要返回的值,那麼返回值會改變嗎?
答案:不會(實踐在後面)
3,如果finally塊中有return語句,那麼函數會通過try塊中的return返回還是通過try塊中的return返回?
答案:通過finally塊中的return返回。
實踐:
寫一個簡單的類,包含兩個方法
public class FinallyReturn {
public static void main(String[] args) {
int num = getNum();
System.out.println("最後返回值是" + num);
}
private static int getNum(){
int num = 4;
try{
num = num + 1;
return num;
}catch(Exception e) {
e.printStackTrace();
}finally{
System.out.println("finall執行了!");
num = num + 100;
System.out.println("finall修改num爲:" + num);
}
//這句在這裏執行不到
return 0;
}
}
執行結果圖:
由圖可知:try塊中有return的時候,finally還是會執行,
返回的結果是5
,說明finally塊修改了num的值,但是不影響最後的函數返回值。
再來看另外一種情況,和上面代碼差不多,只是在finally裏面加了一句return num
:
public class FinallyReturn {
public static void main(String[] args) {
int num = getNum();
System.out.println("最後返回值是" + num);
}
private static int getNum(){
int num = 4;
try{
num = num + 1;
return num;
}catch(Exception e) {
e.printStackTrace();
}finally{
System.out.println("finall執行了!");
num = num + 100;
System.out.println("finall修改num爲:" + num);
return num;
}
}
}
來看結果
由圖可知,如果try塊與finally塊中都有return的時候,函數通過finally塊中的return語句返回。