JavaSE-08-Java異常詳解

 

Java異常詳解

1:異常的定義

1.1:異常的基礎知識

在 Java 編程語言中,異常是指當程序出錯時創建的一種特殊的運行時錯誤對象。注意這個錯誤不是編譯時的語法錯誤。

Java 創建異常對象後,就發送給 Java 程序,即拋出異常(throwing an exception)。程序捕捉到這個異常後,可以編寫相應的異常處理代碼進行處理,而不是讓程序中斷。使用異常處理可以提高程序的健壯性,有助於調試和後期維護。

1.2:異常的實例

當 Java 運行時系統檢查到被零除的情況,它構造一個新的異常對象然後引發該異常。這會導致程序的失敗;執行不下去

2:異常的處理

Java 提供了一種異常處理模型,它使您能檢查異常並進行相應的處理。它實現的是異常處理的抓拋模型。使用此模型,您只需要注意有必要加以處理的異常情況。Java 提供的這種異常處理模型,代替了用返回值或參數機制從方法返回異常碼的手段。

2.1:try-catch

try 塊由一組可執行語句組成,在執行它們時可能會拋出異常。catch 塊,是用來捕獲並處理 try 中拋出的異常的代碼塊。 catch 塊不能單獨存在,可以有多個 catch 塊,以捕獲不同類型的異常。

try 不可以跟隨在 catch 塊之後。

一旦異常被引發,程序控制由 try 塊轉到catch 塊。執行永遠不會從 catch 塊“返回”到 try 塊。

一個 try 和它的 catch 語句形成了一個單元。catch 子句的範圍限制於 try 語句前面所定義的語句。一個 catch 語句不能捕獲另一個 try 聲明所引發的異常

構造catch子句的目的是解決異常情況並且像錯誤沒有發生一樣繼續運行。

try 塊可以嵌套,也就是說,一個 try 語句可以在另一個 try 塊內部。每次進入 try 語句,異常的前後關係都會被推入堆棧。如果一個內部的 try 語句不含特殊異常的 catch 處理程序,堆棧將彈出,下一個 try 語句的 catch 處理程序將檢查是否與之匹配。這個過程將繼續直到一個 catch 語句匹配成功,或者是直到所有的嵌套 try 語句被檢查耗盡。如果沒有 catch 語句匹配,Java 的運行時系統將處理這個異常。

catch可以有多個,但是catch所捕獲的異常,必須先子類後父類,否則會編譯出錯

2.2:finally 塊

finally 塊表示:無論是否出現異常,都會運行的塊

通常在 finally 塊中可以編寫資源返還給系統的語句,通常,這些語句包括但不限於:
(1)釋放動態分配的內存塊:
(2)關閉文件;
(3)關閉數據庫結果集;
(4)關閉與數據庫建立的連接;

它緊跟着最後一個塊,是可選的,不論是否拋出異常,finally 塊總會被執行。finally 塊的語法如下:

try{
}catch(異常類型 1 e){
}catch(異常類型 2 e){
}finally{
}

無論 try 塊是否拋出異常,都會執行 finally 塊。

2.3:try 、catch 、finally 的關係

(1)try 塊不能單獨存在,後面必須跟 catch 塊或者 finally 塊。
(2)三者之間的組合爲:try—catch 、try—catch—finally 、 try—finally這幾種是合法的。
(3)一個 try 塊可以有多個 catch 塊,從上到下多個 catch 塊的範圍爲從小到大。 

2.4:throw 語句

throw 語句用來從代碼中主動拋出異常,可以將它理解爲一個向上拋出的動作。throw 的操作數是任一種異常類對象。是 Throwable 類類型或 Throwable 子類類型的一個對象。簡單類型,例如 int 或 char,以及非 Throwable 類,例如 String 或 Object,不能用作異常。

 public static void main(String[] args) throws ParseException {
        try {
            createException();
        } catch (ZycxException e) {
            //處理異常
        }

    }

    public static void createException() throws ZycxException {
        try {
            //業務處理
        }catch (Exception e){
            //發生異常時向上拋出我們自定義的異常
            throw new ZycxException("發生異常了!!");
        }
    }

我們自定義的異常: 

/**
 * Description:自定義異常
 * Date:       2020/4/28 - 下午 5:57
 * author:     wangkanglu
 * version:    V1.0
 */
public class ZycxException extends Exception{
    public ZycxException(){}

    public ZycxException(String msseage){
        super(msseage);
    }
}

2.5:throws 語句

throws 用來在方法定義時聲明異常。

Java 中對異常的處理有兩種方法,一個就是 try-catch,然後自己處理;一個就是不做處理,向外 throws,由調用該方法的代碼去處理。

2.6  調用棧機制

如果方法中的一個語句拋出一個沒有在相應的 try/catch 塊中處理的異常,那麼這個異常就被拋出到調用方法中。如果異常也沒有在調用方法中被處理,它就被拋出到該方法的調用程序。這個過程要一直延續到異常被處理。如果異常到這時還沒被處理,它便回到 main(), 而且,即使 main()不處理它,那麼,該異常就異常地中斷程序。

3:異常的分類

3.1:異常的分類

在 Java 編程語言中,異常有兩種分類。java.lang.Throwable 類充當所有對象的父類,可以使用異常處理機制將這些對象拋出並捕獲。在 Throwable 類中定義方法來檢索與異常相關的錯誤信息,並打印顯示異常發生的棧跟蹤信息。它有 Error 和 Exception 兩個基本子類。

錯誤(Error):JVM 系統內部錯誤、資源耗盡等嚴重情況;

異常(Exception 違例):其它因編程錯誤或偶然的外在因素導致的一般性問題,例如:對負數開平方根、空指針訪問、試圖讀取不存在的文件、網絡連接中斷等。

當發生 Error 時,程序員根本無能爲力,只能讓程序終止。比如說內存溢出,不可能指望程序能處理這樣的情況。而對於 Exception,而有補救或控制的可能,程序員也可以預先防範,本章主要討論 Exception 的處理。

 

RuntimeException(運行時異常)是指因設計或實現方式不當導致的問題。也可以說,是程序員的原因導致的,本來可以避免發生的情況。

除了 RuntimeException 以及子類,其他的 Exception 及其子類都是受檢查異常。這種異常的特點是 Java 編譯器不會檢查它,也就是說,當程序中出現這類異常時,要麼用try-catch 語句捕獲它,也沒有用 throws 語句聲明拋出它,否則編譯不會通過。

3.1:預定義異常---Java規定好的異常

Java 編程語言中預先定義好的異常叫預定義異常,上面提到的異常都是預定義異常,這些異常的產生不需要程序員手動拋出,即不需要使用throw語句拋出異常,當產生異常時,系統會自動拋出。下面是幾種常見的異常:

受檢查異常:

3.3:自定義異常

Java 語言允許用戶在需要時創建自己的異常類型,用於表述 JDK 中未涉及到的其它異常狀況,這些類型也必須繼承 Throwable 類或其子類。用戶自定義異常類通常屬 Exception 範疇,依據命名慣例,應以 Exception 結尾。用戶自定義異常未被加入 JRE 的控制邏輯中,因此永遠不會自動拋出,只能由人工創建並拋出。

 例子:

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