關於try、catch、finally語句塊中含有return語句的幾點說明

來源:互聯網
上載者:User

Author:wangxu;著作權:wangxu
關於try、catch、finally語句塊中含有return語句的幾點說明:
1、第一種情況:try塊有return語句,catch塊沒有return,函數末尾也沒有return:
看代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
test(num);
}
public static int test(int b){
try{
b += 10;
return b;

}catch(Exception e){

}finally{

}
}
}
編譯結果:
H:\java Demo>javac Demo.java
Demo.java:18: 缺少返回語句
        }
        ^
1 錯誤
有人可能會說,我在try塊中不是有return語句嗎?為什麼會提示缺少return語句呢?這是因為編譯器認為try塊中是又可能產生異常操作

的,也就是說在return語句之前如果出現異常的話,那麼return語句根本沒有機會得到執行,所以編譯器會認為缺少return語句。
解決辦法:a、在catch塊中加入return語句,因為一旦出現異常,catch中的語句可以保證函數會有一個傳回值
b、在finally塊中加入return語句,同樣只要系統不退出,finally語句塊會始終得到執行的
代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;

}catch(Exception e){

}finally{
return 0;
}
}
}
c、在函數末尾加入return語句
代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;

}catch(Exception e){

}finally{

}
return 0;
}
}
2、第二種情況,看代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;

}
return 0;
}
}

結果:H:\java Demo>javac Demo.java
Demo.java:8: "try" 不帶有 "catch" 或 "finally"
                try{
                ^
1 錯誤
說明:也就是說,如果有try語句的話,可以有catch語句,沒有finally語句,但是如果沒有catch語句的話,那麼一定要有finally語句

。並且如果出現catch語句的話,catch語句可以出現多次,而finally語句只能出現一次。
代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;

}catch(RuntimeException e){
}catch(Exception e2){
}finally{
}
return 0;
}
}
3、第三種情況:
a、try塊中有return語句,那麼是先執行return語句,還是先執行finally語句。大家通常會有一個錯誤的認識,可能有的老師都會講錯

,認為是先執行finally語句,再執行return語句,但是這是錯誤的,事實上是先執行return語句,再執行finally語句,然後將結果返回,也可以說return語句執行了兩次,一次在finally之前,一次在finally之後,但是返回的確是第一次執行的值
,如果有不信的,請繼續看代碼,此段代碼可以證明我的觀點:
代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
b += 10;
}
return 0;
}
}
結果:
H:\java Demo>javac Demo.java

H:\java Demo>java Demo
20
說明:此處需要引入緩衝的概念,有對緩衝不太瞭解的也沒關係,程式運行結果是20足以證明我的觀點,程式執行流程是進入try語句塊
執行return語句,但是程式有finally語句塊,所有先將return返回的值緩衝起來,然後程式跳轉到finally語句塊執行,我在finally語

句塊中修改了變數b的值,但是程式返回的依然是20,並不是30,說明finally語句塊執行完畢後,程式直接將之前緩衝的值返回了。所以

這就是真實的執行流程。
b、try塊中有return,finally語句塊中也有return,此時的情況是什麼樣呢?
看代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
b += 10;
return b;
}
}
}
結果是:
H:\java Demo>java Demo
30
說明:為什麼此時結果是30了呢,大家都知道return語句的作用是結束程式體,所以此段代碼依然是先執行try塊中的return語句,並將20

緩衝起來,接著跳轉到finally語句塊執行,但是由於finally語句塊中有return語句,所以程式在此處結束,並不返回到try塊中返回結

果,而是直接將finally塊中新修改的值即30,返回。
c、try塊中有return語句,catch塊中也有return語句,這時候是最簡單的一種情況:
看代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
int a = b/0;
return b;
}catch(Exception e2){
b += 10;
return b;
}
}
}
結果:
H:\java Demo>java Demo
20
說明:我在try塊中觸發了一個異常,程式跳入catch語句塊,try語句塊中剩下的所以語句均沒有執行的機會,接著,我在catch塊中修改

了b的值,此時b應該是20,然後將b值返回,與運行結果相符。
以上幾點基本涵蓋了大部分的情況,掌握這些知識點基本可以應付多數此類問題,如果有什麼錯誤,遺漏歡迎指正。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.