當try、catch、finally中有return時,程序該如何執行?

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());
    }

在這裏插入圖片描述

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