1. 程式人生 > 實用技巧 >java基礎7-異常

java基礎7-異常

異常

java異常結構

Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。異常和錯誤的區別是:異常能被程式本身可以處理,錯誤是無法處理。

Exception 類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發的錯誤。例如,若試圖使用空值物件引用、除數為零或陣列越界,則分別引發執行時異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
Exception(異常)分兩大類:執行時異常和非執行時異常(編譯異常)。程式中應當儘可能去處理這些異常。

  1. 執行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指標異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。執行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句宣告丟擲它,也會編譯通過。
  2. 非執行時異常 (編譯異常):是RuntimeException以外的異常,型別上都屬於Exception類及其子類。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如IOException、SQLException等以及使用者自定義的Exception異常,一般情況下不自定義檢查異常。

通常,Java的異常(Throwable)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。

  1. 可查異常(編譯器要求必須處置的異常):正確的程式在執行中,很容易出現的、情理可容的異常狀況。除了Exception中的RuntimeException及RuntimeException的子類以外,其他的Exception類及其子類(例如:IOException和ClassNotFoundException)都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程式中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句宣告丟擲它,否則編譯不會通過。
  2. 不可查異常(編譯器不要求強制處置的異常):包括執行時異常(RuntimeException與其子類)和錯誤(Error)。RuntimeException表示編譯器不會檢查程式是否對RuntimeException作了處理,在程式中不必捕獲RuntimException型別的異常,也不必在方法體宣告丟擲RuntimeException類。RuntimeException發生的時候,表示程式中出現了程式設計錯誤,所以應該找出錯誤修改程式,而不是去捕獲RuntimeException。

異常處理:

異常丟擲

當一個方法出現錯誤引發異常時,方法建立異常物件並交付執行時系統,異常物件中包含了異常型別和異常出現時的程式狀態等異常資訊。執行時系統負責尋找處置異常的程式碼並執行。
參考https://blog.csdn.net/qq_29229567/article/details/89397648
throws:在方法宣告時用來宣告一個方法可能產生的所有異常,不做任何處理而是將異常往上傳,誰呼叫我我就拋給誰。
throw:在方法體中用來丟擲一個具體的異常型別。常用於丟擲自定義異常

異常捕獲

try{
// 可能出現異常程式碼
} 
catch(ExceptionType1 e){
// 異常型別1處理
}
catch(ExceptionType2 e){
// 異常型別2處理
} finally{
// 最終執行
}

Exception類常用函式:

  1. 返回異常發生時的詳細資訊
    public string getMessage();
  2. 返回異常發生時的簡要描述
    public string toString();
  3. 返回異常物件的本地化資訊。使用Throwable的子類覆蓋這個方法,可以生成本地化資訊。如果子類沒有覆蓋該方法,則該方法返回的資訊與getMessage()返回的結果相同
    public string getLocalizedMessage();
  4. 在控制檯上列印Throwable物件封裝的異常資訊
    public void printStackTrace();