try catch finally 的執行順序

情況一:

//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裏的異常信息即被消化掉了,也達不到異常信息處理的目的。

總結以上的測試:

  1. finally語句總會執行
  2. 如果try catch中有return語句,finally中沒有return語句,那麼在finally中修改除包裝類型和靜態變量.全局變量以外的數據都不會對try catch中返回的變量有影響
  3. 儘量不要在finally中使用return語句,如果使用的話,會忽略try catch中的返回語句,也會忽略try catch中的異常,屏蔽了錯誤的發生
  4. finally中避免再次拋出異常,一旦finally中發生異常,代碼執行將會拋出finally中的異常信息,try catch中的異常將被忽略
  5. 在實際項目中,finally常常用來關閉流或者數據庫資源的,並不額外做其他操作

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章