一、finally執行的情況
在討論return和finally的關係之前,先了解finally的執行情況。在Java中,finally塊一定會執行,無論try、catch塊中的代碼是否拋出了異常,也無論有沒有return語句。當在try、catch塊中有return語句時,finally總是在return之前執行,這意味着finally可以用來釋放資源、關閉連接等操作。下面是一個簡單的示例:
public class FinallyDemo { public static void main(String[] args) { System.out.println(getNumber()); } public static int getNumber() { int num = 1; try{ num++; int result = 10 / 0; return num; }catch(Exception e){ num++; return num; }finally{ num++; System.out.println("finally執行了!"); } } }
輸出結果為:
finally執行了!
3
可以看到,finally塊最後執行並輸出了內容,同時返回值為3,而不是try、catch塊中的返回值。
二、finally對於return語句的影響
在上面的例子中,我們看到了finally塊對於返回值的影響。如果在try塊中有return語句,在執行finally塊之前,該return已經執行完畢,而如果finally塊也有return語句,就會取代之前的return語句。
public class FinallyReturnDemo { public static void main(String[] args) { System.out.println(getNumber()); } public static int getNumber() { int num = 1; try{ num++; int result = 10 / 0; return num; }catch(Exception e){ num++; return num; }finally{ num++; System.out.println("num的值為:"+num); return 999; } } }
輸出結果為:
num的值為:3
999
我們可以看到,雖然在try、catch塊中都有return語句,但是因為finally塊中有return語句,最後返回的值是999而不是try、catch塊中的2或3。
三、如何避免finally影響return的結果
雖然finally對於代碼塊的執行情況有保障,但是對於return語句的處理,會帶來一定的不確定性。為了避免finally對於return語句的影響,可以採用一些技巧。一種方法是避免在finally塊中使用return語句,而是使用一個變量來存儲返回值,最後在finally塊之外返回該變量:
public class FinallyReturnDemo2 { public static void main(String[] args) { System.out.println(getNumber()); } public static int getNumber() { int num = 1; int result = 0; try{ num++; int count = 10 / 0; result = num; }catch(Exception e){ num++; result = num; }finally{ num++; System.out.println("num的值為:"+num); } return result; } }
輸出結果為:
num的值為:3
3
這樣,在finally塊中對於返回值的修改並不會影響返回的結果,而且代碼也更加可讀。
四、總結
在Java中,finally塊總是會執行,無論try、catch塊中的代碼是否拋出了異常,也無論有沒有return語句。在try、catch塊中有return語句時,finally塊總是在return之前執行,如果finally塊中有return語句,就會取代之前的return語句,產生一定的不確定性。為了避免finally對於return語句的影響,可以採用避免在finally塊中使用return語句、使用一個變量來存儲返回值等方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/305086.html