1. 程式人生 > >Java多層巢狀異常處理的基本流程

Java多層巢狀異常處理的基本流程

       異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,錯誤有時候是可以避免的。異常的物件有兩個來源,一是Java執行時環境自動丟擲系統生成的異常,而不管你是否願意捕獲和處理,它總要被丟擲!比如除數為0的異常。二是程式設計師自己丟擲的異常,這個異常可以是程式設計師自己定義的,也可以是Java語言中定義的,用throw 關鍵字丟擲異常,這種異常常用來向呼叫者彙報異常的一些資訊。

       異常是針對方法來說的,丟擲、宣告丟擲、捕獲和處理異常都是在方法中進行的。 

       Java異常處理通過5個關鍵字try、catch、throw、throws、finally進行管理。基本過程是用try語句塊包住要監視的語句,如果在try語句塊內出現異常,則異常會被丟擲,你的程式碼在catch語句塊中可以捕獲到這個異常並做處理;還有以部分系統生成的異常在Java執行時自動丟擲。你也可以通過throws關鍵字在方法上宣告該方法要丟擲異常,然後在方法內部通過throw丟擲異常物件。finally語句塊會在方法執行return之前執行。

       使用try...catch捕獲異常。

        執行try塊裡的業務邏輯程式碼時出現異常,系統自動生成一個異常物件,該異常物件被提交給Java執行時環境,這個過程被稱為丟擲(throw)異常。Java執行時環境收到異常物件時,會尋找能處理該異常物件的catch塊,如果找到合適的catch塊並把該異常物件交給catch塊處理那這個過程被稱為捕獲(catch)異常;如果Java執行時環境找不到捕獲異常的catch塊,則執行時環境終止,Java程式也將退出。

   Java的異常體系:

       訪問異常訊息。

       如果程式需要在catch塊中訪問遺常物件的相關資訊,可以通過呼叫catch後異常形參的方法來獲得。當Java執行時決定呼叫某個catch塊來處理該異常物件時,會將該異常物件賦給catch塊後的異常引數,程式就可以通過該引數來獲得該異常的相關資訊。所有的異常物件都包含了如下幾個常用方法:getMessage():返回該異常的詳細描述字串。printStackTrace():將該異常的跟蹤棧資訊輸出到標準錯誤資訊輸出。printStackTrace(PrintStream s):將該異常的跟蹤棧資訊輸出到指定輸出流。getStackTrace():返回該異常的跟蹤棧資訊。

   異常處理:

try

{

需要檢測的程式碼;

}

catch(異常類 變數)

{

異常處理程式碼;

}

finally

{

一定會執行的程式碼;

}

     異常處理的巢狀。

     異常處理流程程式碼可以放在任何能放可執行性程式碼的地方,因此完整的異常處理流程既可放在try塊裡,也可放在catch塊裡,也可放在finally塊裡。

     異常處理巢狀的深度沒有明確的限制,但通常沒有必要使用超過兩層的巢狀異常處理,層次太深的巢狀異常處理沒有太大必要,而且導致程式可讀性降低。

checked異常與Runtime異常:

      Java的異常被分為兩大類:Checked異常和Runtime異常(執行時異常)。所有RuntimeException類及其子類的例項被稱為Runtime異常;不是RuntimeException類及其子類的異常例項則被稱為Checked異常。

Checked異常的處理:

     當前方法明確知道如何處理該異常,程式應該使用try...catch塊來捕獲該異常,然後在對應的catch塊中修改該異常。當前方法不知道如何處理這種異常,應該在定義該方法時宣告丟擲該異常。 

Runtime異常的處理:

     Runtime異常則更加靈活,Runtime異常無需顯示宣告丟擲。如果程式捕捉Runtime異常,也可以使用try...catch塊來捕捉Runtime異常。

使用throws宣告丟擲異常:

      throws宣告丟擲異常的思路是:當前方法不知道應該如何這種型別的異常,該異常應該由上一級呼叫者處理,如果main方法也不知道應該如何處理這種型別的異常,也可以使用throws宣告丟擲異常,該異常交給JVM處理。JVM對異常的處理方法是:列印異常跟蹤棧資訊,並中止程式的執行,這就是程式在遇到異常後自動結束的原因。

      throws宣告丟擲只能在方法簽名中使用,throws可以宣告丟擲多個異常類,多個異常類之間以逗號隔開。

      如果需要在程式中自行丟擲異常,應使用throw語句,throw語句可以單獨使用,throw語句丟擲的不是異常類,而是一個異常例項,而且每次只能丟擲一個異常例項。throw語句的語法格式如下:throw ExceptionInstance;

     如果throw語句丟擲的異常是Checked異常,則該throw語句要麼處於try塊裡,顯示捕獲該異常,要麼放在一個帶throws宣告丟擲的方法中,即把該異常交給方法的呼叫者處理。

異常處理原則:

    不要過度使用異常;

    不要使用過於龐大的try塊;

    避免使用Catch AII 語句;

    不要忽略捕獲到異常。