Java 異常(Java Exception)(二)

2. try-catch-finally語句

try-catch語句還可以包括第三部分,就是finally子句。它表示無論是否出現(xiàn)異常,都應(yīng)當執(zhí)行的內(nèi)容。try-catch-finally語句的一般語法形式為:

             try {  
    // 可能會發(fā)生異常的程序代碼  
} catch (Type1 id1) {  
    // 捕獲并處理try拋出的異常類型Type1  
} catch (Type2 id2) {  
    // 捕獲并處理try拋出的異常類型Type2  
} finally {  
    // 無論是否發(fā)生異常,都將執(zhí)行的語句塊  
}  

例5 帶finally子句的異常處理程序。

public class TestException {  
    public static void main(String args[]) {  
        int i = 0;  
        String greetings[] = { " Hello world !", " Hello World !! ",  
                " HELLO WORLD !!!" };  
        while (i < 4) {  
            try {  
                // 特別注意循環(huán)控制變量i的設(shè)計,避免造成無限循環(huán)  
                System.out.println(greetings[i++]);  
            } catch (ArrayIndexOutOfBoundsException e) {  
                System.out.println("數(shù)組下標越界異常");  
            } finally {  
                System.out.println("--------------------------");  
            }  
        }  
    }  
}  

運行結(jié)果:

Hello world !


Hello World !!


HELLO WORLD !!!


數(shù)組下標越界異常


在例5中,請?zhí)貏e注意try子句中語句塊的設(shè)計,如果設(shè)計為如下,將會出現(xiàn)死循環(huán)。如果設(shè)計為:

try {  
      System.out.println (greetings[i]); i++;  
} 

小結(jié):
try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執(zhí)行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會被執(zhí)行: 1)在finally語句塊中發(fā)生了異常。 2)在前面的代碼中用了System.exit()退出程序。 3)程序所在的線程死亡。 4)關(guān)閉CPU。

3. try-catch-finally 規(guī)則

  1. 必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時接 catch 和 finally 塊,但至少有一個塊。 2) 必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。 3) catch 塊與相應(yīng)的異常類的類型相關(guān)。 4) 一個 try 塊可能有多個 catch 塊。若如此,則執(zhí)行第一個匹配塊。即Java虛擬機會把實際拋出的異常對象依次和各個catch代碼塊聲明的異常類型匹配,如果異常對象為某個異常類型或其子類的實例,就執(zhí)行這個catch代碼塊,不會再執(zhí)行其他的 catch代碼塊 5) 可嵌套 try-catch-finally 結(jié)構(gòu)。 6) 在 try-catch-finally 結(jié)構(gòu)中,可重新拋出異常。 7) 除了下列情況,總將執(zhí)行 finally 做為結(jié)束:JVM 過早終止(調(diào)用 System.exit(int));在 finally 塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。

4. try、catch、finally語句塊的執(zhí)行順序:

1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執(zhí)行,程序?qū)⑻^catch語句塊,執(zhí)行finally語句塊和其后的語句;

2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現(xiàn)異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執(zhí)行,但finally語句塊后的語句不會被執(zhí)行;

3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執(zhí)行的,當執(zhí)行到某一條語句出現(xiàn)異常時,程序?qū)⑻絚atch語句塊,并與catch語句塊逐一匹配,找到與之對應(yīng)的處理程序,其他的catch語句塊將不會被執(zhí)行,而try語句塊中,出現(xiàn)異常之后的語句也不會被執(zhí)行,catch語句塊執(zhí)行完后,執(zhí)行finally語句塊里的語句,最后執(zhí)行finally語句塊后的語句;

圖示try、catch、finally語句塊的執(zhí)行:

image

圖2 圖示try、catch、finally語句塊的執(zhí)行

歡迎加入學習交流群569772982,大家一起學習交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 八、深入理解java異常處理機制 引子try…catch…finally恐怕是大家再熟悉不過的語句了, 你的答案是...
    壹點零閱讀 1,730評論 0 0
  • Java異常類型 所有異常類型都是Throwable的子類,Throwable把異常分成兩個不同分支的子類Erro...
    予別她閱讀 1,033評論 0 2
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過程中阻礙程序正常執(zhí)行的錯誤事件,當一個程序出現(xiàn)錯誤時,可能的情況有如下3種: 語法...
    niaoge2016閱讀 5,619評論 2 20
  • 初識異常(Exception) 比如我們在取數(shù)組里面的某個值得時候,經(jīng)常會出現(xiàn)定義的取值范圍超過了數(shù)組的大小,那么...
    iDaniel閱讀 1,967評論 1 2
  • 【一個人系列、黃昏的足球場】 [football] Twilight love in a golden time...
    SUPERMAN蘇泊Jane閱讀 335評論 0 0

友情鏈接更多精彩內(nèi)容