Java學習(17) -- 異常

一、異常類型

1)java 分爲異常和錯誤,錯誤不可處理,異常是可以處理的,他們都繼承Throwable.

2) 異常分爲IO異常和運行是異常

3)可以自定義異常

二、正確處理異常

在編寫代碼處理異常時,對於檢查異常,有2種不同的處理方式:使用try…catch…finally語句塊處理它。或者,在函數簽名中使用throws 聲明交給函數調用者caller去解決。

三、自定義異常

如果要自定義異常類,則擴展Exception類即可,因此這樣的自定義異常都屬於檢查異常(checked exception)。如果要自定義非檢查異常,則擴展自RuntimeException。

按照國際慣例,自定義的異常應該總是包含如下的構造函數:

  • 一個無參構造函數
  • 一個帶有String參數的構造函數,並傳遞給父類的構造函數。
  • 一個帶有String參數和Throwable參數,並都傳遞給父類構造函數
  • 一個帶有Throwable 參數的構造函數,並傳遞給父類的構造函數。
public class IOException extends Exception

{

    static final long serialVersionUID = 7818375828146090155L;

 

    public IOException()

    {

        super();

    }

 

    public IOException(String message)

    {

        super(message);

    }

 

    public IOException(String message, Throwable cause)

    {

        super(message, cause);

    }

 

    public IOException(Throwable cause)

    {

        super(cause);

    }

}

四、Error和Exception

Error:表示由 JVM 所偵測到的無法預期的錯誤,由於這是屬於 JVM 層次的嚴重錯誤,導致 JVM 無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤信息。

Exception:表示可恢復的例外/異常,這是可捕捉到的。 

Java 提供了兩類主要的異常:RuntimeException和checked exception。

checked異常也就是我們經常遇到的 IO 異常,以及SQL 異常等。對於這種異常,JAVA 編譯器強制要求我們必需對出現的這些異常進行處理。 
 

五、異常鏈

在一些大型的,模塊化的軟件開發中,一旦一個地方發生異常,則如骨牌效應一樣,將導致一連串的異常。假設B模塊完成自己的邏輯需要調用A模塊的方法,如果A模塊發生異常,則B也將不能完成而發生異常,但是B在拋出異常時,會將A的異常信息掩蓋掉,這將使得異常的根源信息丟失。異常的鏈化可以將多個模塊的異常串聯起來,使得異常信息不會丟失。

異常鏈化:以一個異常對象爲參數構造新的異常對象。新的異對象將包含先前異常的信息。這項技術主要是異常類的一個帶Throwable參數的函數來實現的。這個當做參數的異常,我們叫他根源異常(cause)。
 

六、try-with-resources語句

JDK1.7之後有了try-with-resource處理機制。

首先被自動關閉的資源需要實現Closeable或者AutoCloseable接口,因爲只有實現了這兩個接口纔可以自動調用close()方法去自動關閉資源。

寫法爲try(){}catch(){},將要關閉的外部資源在try()中創建,catch()捕獲處理異常。

其實try-with-resource機制是一種語法糖,其底層實現原理仍然是try{}catch(){}finally{}寫法,不過在catch(){}代碼塊中有一個addSuppressed()方法,即異常抑制方法。

如果業務處理和關閉連接都出現了異常,業務處理的異常會抑制關閉連接的異常,只拋出處理中的異常,仍然可以通過getSuppressed()方法獲得關閉連接的異常。
 

七、finally 和 try 中return 的執行順序

會返回finally中的return值;

當finally調用的任何可變API,會修改返回值;當finally調用任何的不可變API,對返回值沒有影響。
在執行時,是return語句先把返回值寫入但內存中,然後停下來等待finally語句塊執行完,return再執行後面的一段。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章