Java 17 異常相關知識點
思維導圖
對於一個程式來說,理想的狀態下,是都能正確執行的, 但是總會因為軟體和硬體的原因出現一些不可避免的異常以及錯誤。但是,在實際的開發中將不可能這麼的理想,不按規則的資料和有問題的業務程式碼,在 Java 中是如何處理這些異常和錯誤的呢?我們來看一看。
Throwable
該類是 Java 語言中所有錯誤和異常的父類,只有是此類的例項, 或者此類的子類的物件才會被 Java 虛擬機器當做異常或者錯誤丟擲,當然也可以使用顯式的語句觸發。
他的直接子類包含兩個, 一個是 Error(錯誤),另一個是 Exception(異常)。通常用來包含程式發生了異常情況。
為了在編譯時檢查對應的異常,對於 Throwable 的物件和其任何的子類, 只要不是 RuntimeException 和 Error 的子類, 都會被編譯器視為已經檢查了異常資訊。
並且在這些例項中的異常物件都是在上下文中新建立的, 用來包含對應的相關的錯誤資訊,以及堆疊的跟蹤資料。
該類的定義是:
public class Throwable implements Serializable
定義的構造方法:
修飾符
建構函式
描述資訊
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的類和詳細資訊。
除了建構函式, 還有對應的方法。
演示案例:
Error
對於 Error 類, 它是 Throwable 的子類,主要代表的含義是,對於正常的執行程式不應該嘗試去捕獲的嚴重問題。大多數情況錯誤是異常的情況,或者開發者無法控制的情況, 比方說, 執行需要記憶體, 記憶體不足了。 程式肯定無法正常執行,程式儲存需要空間, 硬碟沒有空間了,程式也有出現問題。
對於一個方法不需要在它的 throws 語句中宣告,並且在方法執行期間可能丟擲,但是沒有捕獲的 Error 的任何子類。 因為這些錯誤是不應該發生的異常情況,在編譯器編譯時檢查的時候,Error 及其子類也會被視為未經檢查(unchecked)的異常。因為它的不可預料性,所以大多數情況下無法捕獲到。可以嘗試使用系統級別被識別。
Error 的定義:
public class Error extends Throwable
該類對應的建構函式。
檢視原始碼發現並沒有擴充套件的方法,只有建構函式。
並且所有的建構函式都呼叫了父類的建構函式。
常見的錯誤資訊有: 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());}
正確的情況下不會提示任何錯誤, 編譯執行都無異常。
這個時候, 我們修改對應的 ExceptionTest 為 ExceptionTest2。然後在執行測試。
可以使用 printStackTrace()列印對應的錯誤資訊, 除錯的時候使用比較多, 線上執行專案不會使用該方法。
這裡發現異常使用的場景, ClassNotFoundException 類沒有找到的異常。 其中會有對應的異常資訊。並且檢視其異常的定義。
public class ClassNotFoundException extends ReflectiveOperationException
而 ReflectiveOperationException 又繼承了 Exception ,該類的定義如下:
public class ReflectiveOperationException extends Exception
如何使用自定義的異常
從上面的觀察可以發現想要使用一個異常只要繼承 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 所以需要顯示的捕獲異常才可以。如果不顯示的捕獲異常,編譯會出現錯誤。
修改正常使用的情況
如果不想顯式的丟擲異常,就需要繼承 RuntimeException 類。
程式碼如下:
然後測試執行:
這裡沒有顯示的使用 throws 。 也沒有捕獲對應的異常。但是程式不會出現變異錯誤。但是在執行的時候, 需要需要因為執行異常導致業務無法往下走的問題。
舉例說明,修改傳入的引數改為 “2”:
這裡演示了為 null 以及 type = “2” 的情況, 都是會出現異常。 所以這個時候,就需要捕獲。這種實際在工作中, 會在最上層進行捕獲, 展示給使用者的不是一段異常程式碼就好。
本篇文章, 主要說說 Java 中的異常資訊, 對於異常的程式碼多數都是 Java 1。7 之前的知識點。希望能夠給你程式碼一點幫助。
感謝您的閱讀, 收藏, 點贊, 關注。
說會話這些基礎的知識點, 就應該花個功夫,深入一下, 這樣你的體系就會建立起來。 不會因為專案中學習的知識體系出現斷層。學習技術最快的方式是實戰, 而學習技術體系最全的是書籍,當然官方的文件更好更新。因為第一手資料也很重要。 但是需要有一個知識高度,最起來要知道哪些知識在實際工作中基本上不會用, 學了更好, 不學也不會影響當下的你。只能祝你早日找到適合自己的學習方式。更上一層樓。