try中return某值,而finally中修改了這個值
try中return某值,而finally中修改了這個值
首先上結論:
1、try{…} finally{…} return
順序執行
2、try{ return } finally{…} return
finally修改基本型別,則不影響返回值
finally修改非基本型別,影響返回值
3、try{ return } finally{ return }
try的return表示式執行,但不返回。在finally中返回
本文按以下三方面進行實驗
try中無return、finally中無return
try中有return、finally中無return
try中有return、finally中有return
最後總結
1、try中無return,finally中無return
此時程式就是順序執行,當執行func(10)時,首先執行try{…},然後執行finally{…},最終的返回值是12
public static int func(int x) {
try {
x++;
}catch(Exception e) {
}finally {
x++;
}
return x;
2、try中有return,finally中無return
如果發生改變的是基本型別(byte、short、int、long等),finally雖然執行,但是不影響 最終返回值
如果發生改變的是非基本型別(物件),則finally影響返回的值
//Example1:基本型別 public static int func(int x) { try { x++; // 執行順序 1 return x++; // 執行順序 2 }catch(Exception e) { }finally { System.out.println("x = " + x); System.out.println("finally"); //執行順序 3 x += 2; } // 下面的程式碼不執行,因為在try中就return了 System.out.println("return"); return x; }
上面程式碼執行的順序是:
x++
return x++ ,不返回而是執行x++,並將結果快取起來。等到finally執行完後再返回。
System.out.println(“finally”);
Example2:非基本型別
class A {
int val = 0;
}
public static A func(A a) {
try {
a.val = 1; // 執行順序 1
return a; // 執行順序 2
}catch(Exception e) {
}finally {
a.val = 2; // 執行順序 3
}
// 下面的程式碼不執行
System.out.println("return");
return a;
}
// Test case
A a = new A();
System.out.println(func(a).val); // 2
上面程式碼執行的順序是:
a.val = 1
return a; // 先不返回
a.val = 2;3、try中有return,finally中有return
Example1:基本型別
public static int func(int x) {
try {
return x++; // 執行順序 1
}catch(Exception e) {
}finally {
System.out.println("finally"); // 執行順序 2
x += 2; // 執行順序 3
return x; // 執行順序 4
}
}
執行func(10)的結果是:13
首先執行try中 return的x++,但是結果不返回,而是快取起來。
然後執行finally中的語句,最後在finally中返回。
Example2:非基本型別
class A {
int val = 0;
}
public static A func(A a) {
try {
a.val++; // 執行順序 1
return a;
}catch(Exception e) {
}finally {
System.out.println("finally"); // 執行順序 2
a.val++; // 執行順序 3
return a; // 執行順序 4
}
}
與基本型別相似,首先執行try中 a.val++,但是結果不返回,而是快取起來。
然後執行finally中的語句,最後在finally中返回。
總結一下:
try{…} finally{…} return
順序執行
try{ return } finally{…} return
finally修改基本型別,則不影響返回值
finally修改非基本型別,影響返回值
try{ return } finally{ return }
try的return表示式執行,但不返回。在finally中返回