情況一:
//return 放在trycatch之外
public class TestTryCatch {
public static void main(String[] args) {
testBasic1();
}
public static int testBasic1(){
int i = 1;
try {
i++;
System.out.println("try.....i="+i);
}catch (Exception e){
i++;
System.out.println("catch....i="+i);
}finally {
i=10;
System.out.println("finally...i="+i);
}
return i;
}
}
/*
代碼的執行結果:
try.....i=2
finally...i=10
*/
結論:
這段代碼會按照順序執行,先執行try內的代碼段,沒有異常的話進入finally,最後返回
情況二:
//將return放到try catch中
public class TestTryCatch {
public static void main(String[] args) {
//情況一
//testBasic1();
//情況二
testBasic2();
}
public static int testBasic2(){
int i = 1;
try {
i++;
System.out.println("try.....i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch.....i="+i);
return i;
}finally {
i=10;
System.out.println("finally...i="+i);
}
}
}
/*
執行結果
try.....i=2
finally...i=10
*/
結論:
代碼的執行順序從try到catch,由於finally是無論如何都會執行的,所以try裏的語句並不會直接返回. 在try語句中的return,return返回的引用變量並不是try語句外定義的引用變量i',而是系統重新定義了一個局部引用i,這個引用指向了引用i對應的值,也就是2, 即使在finally語句中吧引用i指向了10,因爲return返回的引用已經不是i,而是i',所以引用的值和try的返回值無關了
情況三:
//將return放入finally中
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
testBasic3();
}
public static int testBasic3(){
int i = 1;
try {
i++;
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch block,i="+i);
return i;
}finally {
i = 10;
System.out.println("finally block,i="+i);
}
}
}
/*
輸出結果
try block,i=2
finally block,i=10
*/
結論:可以看到,是從finally語句塊中返回的。可見,JVM是忽略了try中的return語句。
情況四:
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
//testBasic3();
testBasic4();
}
//在try中加入一段有異常的代碼
public static int testBasic4(){
int i = 1;
try {
i++;
int m = i/0;
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch block,i="+i);
return i;
}finally{
i = 10;
System.out.println("finally block,i="+i);
return i;
}
}
}
/*
執行結果:
catch block,i=3
finally block,i=10
*/
結論:因爲finally中有return語句,try、catch中的異常被消化掉了,屏蔽了異常的發生
情況五:
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
//testBasic3();
//testBasic4();
testBasic5();
}
//finally中有異常發生
public static int testBasic5(){
int i = 1;
try {
i++;
Integer.parseInt(null);
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
String.valueOf(null);
System.out.println("catch block,i="+i);
return i;
}finally {
i = 10;
int m=i/0;
System.out.println("finally block,i="+i);
}
}
}
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
*/
總結:一旦finally裏發生異常,try、catch裏的異常信息即被消化掉了,也達不到異常信息處理的目的。
總結以上的測試:
- finally語句總會執行
- 如果try catch中有return語句,finally中沒有return語句,那麼在finally中修改除包裝類型和靜態變量.全局變量以外的數據都不會對try catch中返回的變量有影響
- 儘量不要在finally中使用return語句,如果使用的話,會忽略try catch中的返回語句,也會忽略try catch中的異常,屏蔽了錯誤的發生
- finally中避免再次拋出異常,一旦finally中發生異常,代碼執行將會拋出finally中的異常信息,try catch中的異常將被忽略
- 在實際項目中,finally常常用來關閉流或者數據庫資源的,並不額外做其他操作