關于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值傳回,與運作結果相符。
以上幾點基本涵蓋了大部分的情況,掌握這些知識點基本可以應付多數此類問題,如果有什麼錯誤,遺漏歡迎指正。