天天看點

Java Exception 異常機制(2) -- try-catch-finally 塊中 return 語句執行順序

Java Exception 異常機制(2) – try-catch-finally 塊中 return 語句執行順序

@ 本文轉載自 https://blog.csdn.net/z69183787/article/details/61922302

作者很詳細的的介紹了各種return在try-catch-finally語句中執行順序

我懷着感恩的心,不要臉的在自己博中随喜人别人的成果~~~~

情況1:try塊中沒有抛出異常try和finally塊中都有return語句

[java] view plain copy
public static int NoException(){  
 int i=;  
 try{  
  System.out.println("i in try block is"+i);  
  return --i;  
 }catch(Exception e){  
  --i;  
  System.out.println("i in catch - form try block is"+i);  
  return --i;  
 }finally{  

  System.out.println("i in finally - from try or catch block is"+i);  
  return --i;  
 }  
}  
           

執行結果:

i in try block is10
i in finally - from try or catch block is9
the method value is8
           

執行順序:執行try塊,執行到return語句時,先執行return的語句,–i,但是不傳回到main 方法,執行finally塊,遇到finally塊中的return語句,執行–i,并将值傳回到main方法,這裡就不會再回去傳回try塊中計算得到的值

情況2:try塊中沒有抛出異常,僅try中有return語句

代碼:

[java] view plain copy
public static int NoException(){  
    int i=;  
    try{  
        System.out.println("i in try block is--"+i);  
        return --i;  
    }catch(Exception e){  
        --i;  
        System.out.println("i in catch - form try block is--"+i);  
        return --i;  
    }finally{  

        System.out.println("i in finally - from try or catch block is--"+i);  
        --i;  
        System.out.println("i in finally block is--"+i);  
        //return --i;  
    }  
}  
           

執行結果:

i in try block is--
i in finally - from try or catch block is--
i in finally block is--
the method value is--9
           

順序:try中執行完return的語句後,不傳回,執行finally塊,finally塊執行結束後,傳回到try塊中,傳回i在try塊中最後的值

情況3:try塊中抛出異常try,catch,finally中都有return語句

代碼:

[java] view plain copy
public static int WithException(){  
    int i=;  
    try{  
        System.out.println("i in try block is--"+i);  
        i = i/;  
        return --i;  
    }catch(Exception e){  
        System.out.println("i in catch - form try block is--"+i);  
        --i;  
        System.out.println("i in catch block is--"+i);  
        return --i;  
    }finally{  

        System.out.println("i in finally - from try or catch block is--"+i);  
        --i;  
        System.out.println("i in finally block is--"+i);  
        return --i;  
    }  
}  
           
執行結果:
i in try block is--
i in catch - form try block is--
i in catch block is--
i in finally - from try or catch block is--
i in finally block is--
the method value is--6
           

順序,抛出異常後,執行catch塊,在catch塊的return的–i執行完後,并不直接傳回而是執行finally,因finally中有return語句,是以,執行,傳回結果6

情況4,catch中有return,finally中沒有,同上,執行完finally語句後,依舊傳回catch中的執行return語句後的值,而不是finally中修改的值

情況5:try和catch中都有異常,finally中無return語句

[java] view plain copy
public static int CatchException(){  
    int i=;  
    try{  
        System.out.println("i in try block is--"+i);  
        i=i/;  
        return --i;  
    }catch(Exception e){  
        System.out.println("i in catch - form try block is--"+i);  
        int j = i/;  
        return --i;  
    }finally{  

        System.out.println("i in finally - from try or catch block is--"+i);  
        --i;  
        System.out.println("i in finally block is--"+i);  
        //return --i;  
    }  
}  
           

結果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
Exception in thread "main" Java.lang.ArithmeticException: / by zero
 at exception.ExceptionTest0123.CatchException(ExceptionTest0123.java:)
 at exception.ExceptionTest0123.main(ExceptionTest0123.java:)
           

執行順序:在try塊中出現異常,到catch中,執行到異常,到finally中執行,finally執行結束後判斷發現異常,抛出

情況6:try,catch中都出現異常,在finally中有傳回

[javascript] view plain copy
public static int CatchException(){  
    int i=;  
    try{  
        System.out.println("i in try block is--"+i);  
        i=i/;  
        return --i;  
    }catch(Exception e){  
        System.out.println("i in catch - form try block is--"+i);  
        int j = i/;  
        return --i;  
    }finally{  

        System.out.println("i in finally - from try or catch block is--"+i);  
        --i;  
        System.out.println("i in finally block is--"+i);  
        return --i;  
    }  
}  
           
運作結果:
i in try block is--
i in catch - form try block is--
i in finally - from try or catch block is--
i in finally block is--
the method value is--8
           

執行順序:try塊中出現異常到catch,catch中出現異常到finally,finally中執行到return語句傳回,不檢查異常

沒有catch,隻有try和finally時,執行順序和上面的幾種情況差不多,隻是少了catch塊的執行

Ted總結

通過以上幾個例子,聰明帥氣的我可以看出:

* 無論在try 或是 在catch 塊中,如果産生異常,那麼異常後的return變化值将不會執行,異常前的變量值将按順序傳遞

* 如果try 塊中沒有異常,代碼将不會執行catch塊中的内容,傻傻的我以前已經無論是否有異常,catch塊的System.out.print都是會列印呢

* 在Java語言的異常進行中,finally塊的作用就是為了保證無論出現什麼情況,finally塊裡的代碼一定會被執行。由于程式執行return就意味着結束對目前函數的調用并跳出這個函數體,是以任何語句要執行都隻能在return前執行(除非在try 或 catch塊中 碰到exit函數),是以finally塊裡的代碼也是在return之前執行的。

如果try-catch-finally三者中都有return(且try塊中捕捉到異常,如果try塊中未有異常,将不會執行catch塊啊),那麼會發生值傳遞,最終以finally塊中的變量值傳回調用者