Java 17 異常知識點入門到實戰就這一篇

Java 17 異常相關知識點

思維導圖

Java 17 異常知識點入門到實戰就這一篇

對於一個程式來說,理想的狀態下,是都能正確執行的, 但是總會因為軟體和硬體的原因出現一些不可避免的異常以及錯誤。但是,在實際的開發中將不可能這麼的理想,不按規則的資料和有問題的業務程式碼,在 Java 中是如何處理這些異常和錯誤的呢?我們來看一看。

Throwable

該類是 Java 語言中所有錯誤和異常的父類,只有是此類的例項, 或者此類的子類的物件才會被 Java 虛擬機器當做異常或者錯誤丟擲,當然也可以使用顯式的語句觸發。

他的直接子類包含兩個, 一個是 Error(錯誤),另一個是 Exception(異常)。通常用來包含程式發生了異常情況。

為了在編譯時檢查對應的異常,對於 Throwable 的物件和其任何的子類, 只要不是 RuntimeException 和 Error 的子類, 都會被編譯器視為已經檢查了異常資訊。

並且在這些例項中的異常物件都是在上下文中新建立的, 用來包含對應的相關的錯誤資訊,以及堆疊的跟蹤資料。

該類的定義是:

public class Throwable implements Serializable

定義的構造方法:

Java 17 異常知識點入門到實戰就這一篇

修飾符

建構函式

描述資訊

Throwable()

構造一個 throwable 物件,使用 null 作為其詳細資訊。

Throwable(String message)

構造一個可 throwable 物件,使用 message 作為其詳細的資訊。

Throwable(String message, Throwable cause)

構造一個可 throwable 物件,使用一個 message 和 cause 作為詳細資訊。

protected

Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)

構造一個可 throwable 物件,使用 message 和 cause 作為詳細資訊,並指定是否開啟 suppression 和 是否開啟可寫堆疊跟蹤。

Throwable(Throwable cause)

構造一個可 throwable 物件,使用用指定的message 和 cause (cause==null ? null: cause。 tostring()),它通常包含cause的類和詳細資訊。

除了建構函式, 還有對應的方法。

Java 17 異常知識點入門到實戰就這一篇

演示案例:

Java 17 異常知識點入門到實戰就這一篇

Error

對於 Error 類, 它是 Throwable 的子類,主要代表的含義是,對於正常的執行程式不應該嘗試去捕獲的嚴重問題。大多數情況錯誤是異常的情況,或者開發者無法控制的情況, 比方說, 執行需要記憶體, 記憶體不足了。 程式肯定無法正常執行,程式儲存需要空間, 硬碟沒有空間了,程式也有出現問題。

對於一個方法不需要在它的 throws 語句中宣告,並且在方法執行期間可能丟擲,但是沒有捕獲的 Error 的任何子類。 因為這些錯誤是不應該發生的異常情況,在編譯器編譯時檢查的時候,Error 及其子類也會被視為未經檢查(unchecked)的異常。因為它的不可預料性,所以大多數情況下無法捕獲到。可以嘗試使用系統級別被識別。

Error 的定義:

public class Error extends Throwable

Java 17 異常知識點入門到實戰就這一篇

該類對應的建構函式。

Java 17 異常知識點入門到實戰就這一篇

檢視原始碼發現並沒有擴充套件的方法,只有建構函式。

Java 17 異常知識點入門到實戰就這一篇

並且所有的建構函式都呼叫了父類的建構函式。

常見的錯誤資訊有: IOError, LinkageError(NoClassDefFoundError),雖然 LinkageError 不常見, 但是 NoClassDefFoundError 在初學的時候, 不使用 IDE 的情況下還是容易出現的。

在虛擬機器(JVM ) 載入 class 的時候,而沒有找到對應的 class 報出的錯誤,注意和 ClassNotFoundException 的區別, 一個是異常, 一個是錯誤。

常見的錯誤 Error 有:

NoClassDefFoundError ( 找不到 class 定義的錯誤 )。

OutOfMemoryError(記憶體溢位的錯誤 )。

StackOverflowError( 堆疊溢位的錯誤 )。

Exception

對於 Exception 以及其子類,同樣的繼承 Throwable 類,它可以使用應用程式本身的程式捕獲對應的異常資訊。

對於 Exception 異常, 包含兩種型別:

檢查型別(checked)

非檢查型別(unchecked)。

對應的是 RuntimeException 及其子類非檢查異常

UncheckedException

,另外一種不包含 RuntimeException 的檢查型別異常

CheckedException

常見的非檢查異常(UncheckedException)有:

Nullpointer Exception ( 空指標異常 )。

ClassCastException( 型別強制轉換異常 )。

IllegalArgumentException( 傳遞非法引數異常 )。

IndexOutOfBoundsException( 下標越界異常 )。

NumberFormatException( 數值型別轉換異常 )。

ArrayIndexOutOfBoundsException( 陣列下標越界異常 )。

ArrayStoreException( 資料儲存異常,運算元組時型別不一致 )。

ArithmeticException( 算術異常 )。

BufferOverflowException( 緩衝區溢位異常 )。

常見的檢查異常(CheckedException)有:

IOException ( IO 操作異常)。

SQLException ( SQL 操作語句異常)

ClassNotFoundException ( 類找不到的異常 )。

除了以上的還有很多很多異常和錯誤的資訊, 詳細的可以參看 Error 和 Exception 的子類及子子。。。類。

異常的捕獲

上面介紹了基礎的異常和錯誤資訊, 知道了錯誤的異常無法捕獲,而異常資訊檢查類的異常都需要進行捕獲,對於非檢查類的異常多數是由程式設計師編寫的程式碼存在bug,而出現的。而檢查類的需要使用捕獲的語法try{}catch(){}。

語法定義:

try{ //需要丟擲檢查型別異常的執行內容}catch(Exception ex){ // ex 的資訊}

對於需要捕獲的異常都需要使用 throws 丟擲。 例如如下程式碼:

// Class 中的 forName 方法public static Class<?> forName(String className) throws ClassNotFoundException

使用該方法的時候就需要捕獲異常。

try { Class。forName(“ExceptionTest”);} catch (ClassNotFoundException ex) { System。out。println(ex。getMessage());}

正確的情況下不會提示任何錯誤, 編譯執行都無異常。

Java 17 異常知識點入門到實戰就這一篇

這個時候, 我們修改對應的 ExceptionTest 為 ExceptionTest2。然後在執行測試。

Java 17 異常知識點入門到實戰就這一篇

可以使用 printStackTrace()列印對應的錯誤資訊, 除錯的時候使用比較多, 線上執行專案不會使用該方法。

這裡發現異常使用的場景, ClassNotFoundException 類沒有找到的異常。 其中會有對應的異常資訊。並且檢視其異常的定義。

public class ClassNotFoundException extends ReflectiveOperationException

而 ReflectiveOperationException 又繼承了 Exception ,該類的定義如下:

public class ReflectiveOperationException extends Exception

Java 17 異常知識點入門到實戰就這一篇

如何使用自定義的異常

從上面的觀察可以發現想要使用一個異常只要繼承 Exception 類即可。或者繼承 RuntimeException 類。

舉例,定義一個自定義的異常類 CustException 繼承自 Exception 類,並定義對應的建構函式。

public class CustException extends Exception { public CustException() { } public CustException(String message) { super(message); } public CustException(Throwable cause) { super(cause); } public CustException(String message, Throwable cause) { super(message, cause); } public CustException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }

編寫測試類。 因為繼承自 Exception 所以需要顯示的捕獲異常才可以。如果不顯示的捕獲異常,編譯會出現錯誤。

Java 17 異常知識點入門到實戰就這一篇

修改正常使用的情況

Java 17 異常知識點入門到實戰就這一篇

如果不想顯式的丟擲異常,就需要繼承 RuntimeException 類。

程式碼如下:

Java 17 異常知識點入門到實戰就這一篇

然後測試執行:

Java 17 異常知識點入門到實戰就這一篇

這裡沒有顯示的使用 throws 。 也沒有捕獲對應的異常。但是程式不會出現變異錯誤。但是在執行的時候, 需要需要因為執行異常導致業務無法往下走的問題。

舉例說明,修改傳入的引數改為 “2”:

Java 17 異常知識點入門到實戰就這一篇

這裡演示了為 null 以及 type = “2” 的情況, 都是會出現異常。 所以這個時候,就需要捕獲。這種實際在工作中, 會在最上層進行捕獲, 展示給使用者的不是一段異常程式碼就好。

Java 17 異常知識點入門到實戰就這一篇

本篇文章, 主要說說 Java 中的異常資訊, 對於異常的程式碼多數都是 Java 1。7 之前的知識點。希望能夠給你程式碼一點幫助。

感謝您的閱讀, 收藏, 點贊, 關注。

說會話這些基礎的知識點, 就應該花個功夫,深入一下, 這樣你的體系就會建立起來。 不會因為專案中學習的知識體系出現斷層。學習技術最快的方式是實戰, 而學習技術體系最全的是書籍,當然官方的文件更好更新。因為第一手資料也很重要。 但是需要有一個知識高度,最起來要知道哪些知識在實際工作中基本上不會用, 學了更好, 不學也不會影響當下的你。只能祝你早日找到適合自己的學習方式。更上一層樓。