1. 程式人生 > 其它 >Java基礎——異常體系

Java基礎——異常體系

  • 在Java中,異常物件都是派生於Throwable類的一個例項,Java的異常體系如下圖所示:

   所有的異常都是由Throwable繼承而來,在下一層立即分解為兩個分支,ErrorException

  • Error錯誤:描述了Java執行時系統的內部錯誤和資源耗盡錯誤。一般是指虛擬機器相關的問題,如系統崩潰,虛擬機器出錯誤等,這種錯誤無法恢復或不可能捕獲,將導致應用程式中斷,通常不處理。因為如果出現這樣的內部錯誤,除了通告使用者,並盡力使程式安全地終止之外,再也無能為力了。
  • Exception異常:Java的異常分為兩種,checked Exception(編譯時異常)和 RuntimeException
    (執行時異常)。
  1. checked Exception(編譯時異常): Java認為checked Exception都是可以在編譯階段被處理的異常,一般是IOException和SQLException。所以它強制程式處理所有的checked Exception,而RuntimeException無須處理,java程式必須顯式處理checked Exception,如果程式沒有處理,則在編譯時會發生錯誤,無法通過編譯。用try{...}catch{...}finally{...}進行處理或throw和throws丟擲異常。
  2. RuntimeException(執行時異常):這些異常一般是由程式邏輯錯誤引起的,一般都是程式設計師的錯,
    表示程式存在bug,所以,一般不需要進行異常處理,直接讓程式停止,由呼叫者對程式碼進行修正。常見的有NullPointException,IndexOutOfBoundsException(下標越界異常),ClassCastException,ArithmeticException(算數運算異常,例如除數為0等),ArrayStoreException (向陣列中存放與宣告型別不相容物件異常),NegativeArraySizeException(建立一個大小為負數的陣列錯誤異常),NumberFormatException(數字格式異常)等
    • 出現執行時異常後,系統會自動把異常一直往上層拋(不需要程式設計師在程式碼中丟擲),一直遇到處理程式碼。如果沒有處理塊,到最上層,如果是多執行緒就由Thread.run()丟擲,如果是單執行緒就被main()丟擲。丟擲之後,如果是執行緒,這個執行緒也就退出了。如果是主程式丟擲的異常,那麼這整個程式也就退出了。執行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。                                                                                             
    • 如果不想終止,則必須撲捉所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會執行時異常,或者是通過對異常的處理顯式的控制程式退出。
  • Java異常處理方法有:丟擲異常,捕捉異常。主要依賴於try、catch、finally、throw、throws五個關鍵字。
  1. try:它裡面放置可能引發異常的程式碼
  2. catch:後面對應異常型別和一個程式碼塊,用於表明該catch塊用於處理這種型別的程式碼塊,可以有多個catch塊。
  3. finally:主要用於回收在try塊裡開啟的物力資源(如資料庫連線、網路連線和磁碟檔案),異常機制總是保證finally塊總是被執行。只有finally塊執行完成之後,才會回來執行try或者catch塊中的return或throw語句,如果finally中使用了return或者 throw等終止方法的語句,則就不會跳回執行,直接停止。
  4. throw:用於丟擲一個實際的異常,可以單獨作為語句使用,丟擲一個具體的異常物件。
  5. throws用在方法簽名中,用於宣告該方法可能丟擲的異常
 1 import java.io.IOException;
 2 
 3 public class Test {
 4     
 5     public static void main(String[] args) {
 6         System.out.println("returning result is " + testException());
 7     }
 8     
 9     public static int testException(){
10         int i = 1 ;
11         try{
12             throw new IOException() ;            
13         }catch(Exception e){
14             System.out.println("catch it !");
15             return i;
16         }finally{
17             i = 2 ;
18             System.out.println("finally ok") ;
19             System.out.println("i = " + i) ;
20             //return i ;
21         }
22     }
23 }

當第20行的return語句註釋掉時,輸出的結果是    catch it !    finally ok    i = 2    returning result is 1 同時也表明如果try 或 catch 中有return語句,則在進入finally之前,Java的中間快取變數機制已經將try 或 catch 中返回的結果進行了快取,執行完finally中的語句後,直接將快取結果return,而當finally中有return語句時,則直接return當前的結果即可。  當第20行的return語句沒有註釋掉時,輸出的結果是    catch it !    finally ok    i = 2    returning result is 2