try、catch中有return,而finally中沒有return
1、首先說明下,無論try、catch中是否有return,無論是否產生異常,finally代碼是一定會執行的,代碼驗證如下:
public int handleTest1(){
int b=0;
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return b;
}
catch(Exception e){
System.out.println("catch ");
b=b+1;
return b;
//return str;
}
finally {
b=b+1;
System.out.println("finally");
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的結果"+new ExceptionHandle().handleTest1());
}
導致上述結果的原因在於,代碼在執行完try或者catch之後,會將返回的結果保存,當執行完finally代碼塊時,再將保存的值返回。仔細觀察上述代碼,你會發現在finally代碼塊中將b+1,並沒有對catch代碼塊中的返回值產生影響,這是因爲b值是基本類型,catch代碼塊保存返回值時將b值複製了一份,產生了一份副本,返回的是b的副本的值,因此finally代碼塊中的b+1加的b本身,而不是副本上,因此不會對返回值有影響。驗證代碼如下,在finnally返回b,最終返回的值是2而不是1。
public int handleTest1(){
int b=0;
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return b;
}
catch(Exception e){
System.out.println("catch ");
b=b+1;
return b;
//return str;
}
finally {
b=b+1;
System.out.println("finally");
return b;
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的結果"+new ExceptionHandle().handleTest1());
}
2、若返回的值是引用數據類型時,則另當別論,在finally中修改try或者catch的返回值,會影響返回的結果,因爲返回值爲引用數據類型時返回的是對象本身,而不是副本,在finally代碼塊中修改返回值,修改的是對象本身的值,因此會影響返回的結果。驗證代碼如下:
public StringBuilder handleTest(){
StringBuilder sb=new StringBuilder("aaa");
try{
System.out.println("try"+sb);
int a=10/1;
return sb;
}
catch(Exception e){
System.out.println("catch 1");
//return str;
}
finally {
sb.append("bbb");
System.out.println("finally"+sb);
//return 2;
}
return null;
}
3、再者我們發現即使try中有return,但只要異常發生,返回的結果還是catch中的返回值,這是因爲當檢測到異常發生時,出現異常的代碼後面的程序都不會得到執行,而是轉向catch代碼塊執行,例如下面驗證代碼中得try1這個字符串沒有得到輸出。
public int handleTest1(){
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return 0;
}
catch(Exception e){
System.out.println("catch ");
return 1;
//return str;
}
finally {
System.out.println("finally");
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的結果"+new ExceptionHandle().handleTest1());
}
try、catch、finally中都有return
當try、catch代碼塊中都有return時,發生異常時返回的是catch代碼塊的值,那當try、catch、finally代碼塊中都有return時,那返回的是哪個代碼塊中的值?當finally正常結束返回的是try或者catch中的返回值,而當finally有return,就相當於finally代碼塊提前結束,返回的是finally代碼塊中的返回值。驗證代碼如下:
public int handleTest1(){
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return 0;
}
catch(Exception e){
System.out.println("catch ");
return 1;
//return str;
}
finally {
System.out.println("finally");
return 2;
}
}
public static void main(String[] args){
System.out.println("返回的結果"+new ExceptionHandle().handleTest1());
}