至少有兩種情況下finally語句是不會被執行的:
(1)try語句沒有被執行到,如在try語句之前return就回傳了,這樣finally語句就不會執行。這也說明了finally語句被執行的必要而非充分條件是:對應的try語句一定被執行到。
(2)在try區塊|catch區塊中有System.exit(0);這樣的語句。 System.exit(0)是終止Java虛擬機器JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。
在try-catch-finally中, 當return遇到finally,return對finally無效,即:
1.在try catch區塊裡return的時候,finally也會被執行。
2.finally裡的return語句會把try catch區塊裡的return語句效果覆蓋掉。
結論:return語句不一定都是函數的出口,執行return時,只是把return後面的值複製了一份到回傳值變數裡去了。
class Exc{ int a; int b; } public class Except { @SuppressWarnings("finally") static int compute (){ Exc e = new Exc(); e.a = 10; e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println("try ……"); return res + 1; }catch(NullPointerException e1){ System.out.println("NullPointerException occured"); }catch(ArithmeticException e1){ System.out.println("ArithmeticException occured"); }catch(Exception e3){ System.out.println("Exception occured"); }finally{ System.out.println("finnaly occured"); } System.out.println(res); return res+3; } public static void main(String[] args){ int b = compute(); System.out.println("mian b= "+b); } }
輸出:
try …… finnaly occured mian b= 2
結論: 如果沒有例外, 則執行try 中的程式碼區塊,直到try 中的return ,接著執行finally 中的程式碼區塊,finally 執行完後, 回到try 中執行return 。退出函數。
class Exc{ int a; int b; } public class Except { @SuppressWarnings("finally") static int compute (){ Exc e = new Exc(); // e.a = 10; // e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println("try ……"); return res + 1; }catch(NullPointerException e1){ System.out.println("NullPointerException occured"); }catch(ArithmeticException e1){ System.out.println("ArithmeticException occured"); }catch(Exception e3){ System.out.println("Exception occured"); }finally{ System.out.println("finnaly occured"); } System.out.println(res); return res+3; } public static void main(String[] args){ int b = compute(); System.out.println("mian b= "+b); } }
輸出:
ArithmeticException occured finnaly occured 0 mian b= 3
#結論: 如果try 中有異常, 則在異常語句處,跳到catch 捕獲的異常代碼區塊,執行完catch 後,再執行finally ,跳出try{}catch{}finally{} ,繼續往下執行,不會去執行try中後面的語句。
以上是java中finally語句的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!