一、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-hant/n/305086.html
微信掃一掃
支付寶掃一掃