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塊中的變量值傳回調用者