天天看點

Java的異常處理

1. Java 中異常分為哪些種類

按照異常需要處理的時機分為編譯時異常(CheckedException)和運作時異常(RuntimeException)。隻有java語言提供了Checked異常, Java 認為Checked異常都是可以被處理的異常,是以Java程式必須顯式處理Checked異常。如果程式沒有處理Checked異常,該程式在編譯時就會發生錯誤無法編譯。這展現了Java的設計哲學:沒有完善錯誤處理的代碼根本沒有機會被執行。對Checked異常處理方法有兩種:

1目前方法知道如何處理該異常,則用try…catch塊來處理該異常。

2目前方法不知道如何處理,則在定義該方法是聲明抛出該異常。

運作時異常隻有當代碼在運作時才發行的異常,編譯時不需要try catch。Runtime如除數是0和數組下标越界等,其産生頻繁,處理麻煩,若顯示申明或者捕獲将會對程式的可讀性和運作效率影響很大。是以由系統自動檢測并将它們交給預設的異常處理程式。當然如果你有處理要求也可以顯示捕獲它們。

2.調用下面的方法,得到的傳回值是什麼?

public int getNum() {
    try {
  int a = 1/0;
  return 1;
    } catch (Exception e) {
  return 2:
    } finally{
  return 3;
}      

代碼在走到第3行的時候遇到了一個MathException

,這時第四行的代碼就不會執行了,代碼直接跳轉到catch語句中,走到第6行的時候,異常機制有這麼一個原則如果在catch中遇到了return或者異常等能使該函數終止的話那麼有finally 就必須先執行完finally代碼塊裡面的代碼然後再傳回值。是以代碼又跳到第8行,可惜第8行是一個return語句,那麼這個時候方法就結束了,是以第6行的傳回結果就無法被真正傳回。如果finally僅僅是處理了一個釋放資源的操作,那麼該道題最終傳回的結果就是2。是以上面傳回值是3。

3.error和exception的差別?

Error類和Exception類的父類都是Throwable類,他們的差別如下。

Error類一般是指與虛拟機相關的問題,如系統崩潰,虛拟機錯誤,記憶體空間不足,方法調用棧溢出等。對于這類錯誤的導緻的應用程式中斷,僅靠程式本身無法恢複和和預防,遇到這樣的錯誤,建議讓程式終止。

Exception類表示程式可以處理的異常,可以捕獲且可能恢複。遇到這類異常,應該盡可能處理異常,使程式恢複運作,而不應該随意終止異常。

Exception類又分為運作時異常( Runtime Exception) 和受檢查的異常(Checked Exception

),運作時異常;ArithmaticException, llegalArgumentException,編譯能通過,但是一運作就終止了

,程式不會處理運作時異常,出現這類異常,程式會終止。而受檢查的異常,要麼用try…catch

捕獲,要麼用throws字句聲明抛出,交給它的父類處理,否則編譯不會通過。

4.Java異常處理機制

Java對異常進行了分類,不同類型的異常分别用不同的Java類表示,所有異常的根類為java.lang.Throwable,

Throwable下面又派生了兩個子類: Error 和Exception,

Error 表示應用程式本身無法克服和恢複的一種嚴重問題。

Exception表示程式還能夠克服和恢複的問題,其中又分為系統異常和普通異常,系統異常是軟體本身缺陷所導緻的問題,也就是軟體開發人員考慮不周所導緻的問題,軟體使用者無法克服和恢複這種問題,但在這種問題下還可以讓 軟體系統繼續運作或者讓軟體死掉,例如,

數組腳本越界(ArrayIndexOutOfBoundsException) ,

空指針異常(NullPointerException),

類轉換異常(ClassCastException) ;

普通異常是運作環境的變化或異常所導緻的問題,

是使用者能夠克服的問題,例如,網絡斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。

java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try…catch處理或用throws聲明繼續抛給上層調用方法處理,是以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,是以,編譯器不強制用try.catch處理或用throws聲明,是以系統異常也稱為unchecked異常。

5.下面列舉幾個常見的RuntimeException

(1) java.lang.NullPointerException 空指針異常;出現原因:調用了未經初始化的對象或者是不存在的對象。

(2) java.lang.ClassNotFoundException 指定的類找不到;出現原因:類的名稱和路徑加載錯誤;通常都是程式

試圖通過字元串來加載某個類時可能弓|發異常。

(3) java.lang.NumberFormatException 字元串轉換為數字異常;出現原因:字元型資料中包含非數字型字元。

(4) java.lang.IndexOutOfBoundsException 數組角标越界異常,常見于操作數組對象時發生。

(5) java.lang.IIlegalArgumentException 方法傳遞參數錯誤。

(6) java.lang.ClassCastException 資料類型轉換異常。

(7)java.lang.NoClassDefFoundException 未找到類定義錯誤。

(8) sQLException SQL異常,常見于操作資料庫時的SQL語句錯誤。

(9) java.lang.InstantiationException 執行個體化異常。

(10) java.lang.NoSuchMethodException 方法不存在異常。

6. throw 和throws的差別

throw:

(1) throw語句用在方法體内表示抛出異常,由方法體内的語句處理。

(2) throw是具體向外抛出異常的動作,是以它抛出的是一個異常執行個體, 執行throw一定是抛出了某種異常。

throws:

(1) throws語句是用在方法聲明後面,表示如果抛出異常,由該方法的調用者來進行異常的處理。

(2) throws 主要是聲明這個方法會抛出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。

(3) throws 表示出現異常的一種可能性,并不一定會發生這種異常。

7. final、 finally、 finalize 的差別?

(1) final: 用于聲明屬性,方法和類,分别表示屬性不可變,方法不可覆寫,被其修飾的類不可繼承。

(2) finally: 異常處理語句結構的一部分,表示總是執行。

(3) finalize: Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆寫此方法,提供垃圾收集時的其他資源回收,例如關閉檔案等。該訪法更像是一個對象生命周期的臨終方法, 當該方法被系統調用則代表該對象即将“死亡”,但是需要注意的是,我們主動行為上去調用該方法并不會導緻該對象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用。