天天看點

try、catch、finally語句塊中含有return

關于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值傳回,與運作結果相符。

以上幾點基本涵蓋了大部分的情況,掌握這些知識點基本可以應付多數此類問題,如果有什麼錯誤,遺漏歡迎指正。