理解 Java 中的異常層次結構

已發表: 2022-03-08

“異常”一詞是“異常事件”的縮寫。 在Java中,異常本質上是在程序執行過程中發生的一個事件,會破壞程序的正常流程。 異常是不需要的,而且大多是意外的,通常在運行時或編譯時出現。 需要處理所有這些異常以確保程序在其自然流程中運行。

但是,在處理異常之前,了解 Java 中存在哪些不同類型的異常會有所幫助。 通過這篇文章,讓我們看看Java中的各種異常類型以及它們所遵循的異常層次結構。

目錄

Java中的異常層次結構

Java 編程語言中異常的層次結構始於 Throwable 類——它來自 Object 類並且是它的直接子類,而 Exception 類將所有的 Throwable 類進一步分支為兩個子類——Error 和 Exception。 這是一個流程圖,可以更好地理解 Java 異常層次結構:

Exception 類提供了您在使用 Java 編程語言時可能需要處理的所有異常。 此類異常的一些常見和遇到的示例包括 NullPointerException、ClassNotFoundException、IllegalArgumentException 等。

另一方面,Error 類負責處理 Java 程序體系結構中更嚴重的問題,而不是在應用程序代碼中處理。 Java 中的一些錯誤示例包括 InternalError、AssertionError、OutOfMemoryError 等。

Java中的異常進一步分為兩類:

  • 檢查異常——這些也稱為編譯時異常。
  • 未經檢查的異常——這些也稱為運行時異常。

此時要注意的重要一點是,未經檢查的異常都是 RuntimeException 類的子類。 我們將在本文後面詳細討論已檢查和未檢查的異常。 但在此之前,讓我們從本質上看一下錯誤和異常在工作中的不同之處,以免造成混淆。

Java 中的錯誤和異常——它們有何不同?

Java 編程語言的官方文檔將錯誤稱為 Java 編程過程中發生的錯誤——“表明一個合理的應用程序不應該嘗試捕獲的嚴重問題”。 錯誤的嚴重性從這個陳述的方式就可以清楚地看出。 顯然,這是指您的程序可能面臨的一系列問題,如果不重構代碼或修改 Java 應用程序體系結構,就無法從這些問題中恢復。

讓我們看一個會拋出錯誤的 Java 方法:

公共靜態無效打印(字符串 S){

印刷);

}

在上面提到的代碼中,方法 print() 充當遞歸方法,不斷地重複調用自身,一遍又一遍,直到達到 Java 中線程堆棧的最大允許大小。 此時,它會以非常常見的 StackOverflowError 退出執行,其內容如下:

線程“main”中的異常 java.lang.StackOverflowError

在 StackOverflowErrorExample.print(StackOverflowErrorExample.java:3)

如上例所示,該方法拋出了一個示例,但代碼本身無法處理此錯誤。 因此,程序只是退出執行,因為損壞是不可恢復的。 作為解決方案,需要修改代碼。

與錯誤相反,異常表示可以被合理的應用程序捕獲的條件。 Java 中的異常包括可能在編譯時或運行時發生的問題。 這些異常在所有應用程序中都相當頻繁地發生——尤其是在測試和調試階段。 因此,Java 中的異常可以在程序本身內處理,以確保代碼運行其自然流程。

現在,讓我們通過查看已檢查和未檢查異常是什麼來進一步討論 Java 中的異常層次結構。

Java 中的已檢查和未檢查異常

如前所述,Java 程序中的異常可能發生在編譯時或運行時。 這就是為我們提供了 Java 中存在的兩種廣泛類型的異常的原因。 下面詳細介紹這兩個異常。

編譯時異常

在編譯時發生的異常稱為編譯時異常。 這些也稱為檢查異常,因為您需要在 Java 程序中顯式檢查它們並在代碼本身中處理它們。 InterruptedException、IOException 等類都是檢查異常。

讓我們看一個可以處理已檢查異常的方法:

公共無效 writeAFile() {

嘗試 (BufferedWriter b_w = new BufferedWriter(new FileWriter(“myFile.txt”))) {

b_w.write(“測試”);

} 捕捉(IOException ioe){

ioe.printStackTrace();

}

}

如您所見,上述代碼的 try 塊中有兩條語句——

  • 實例化對象——BufferedWriter
  • 使用對象寫入文件

這兩個語句都可以拋出 IOException。 IOException 是一個 Checked Exception,需要由調用者或方法處理。 在上面的示例中,您可以看到在方法本身內處理的異常。

運行時異常

與編譯時拋出的編譯時異常相反,運行時或未經檢查的異常可以“隨時”拋出,這本質上意味著在運行時。 因此,方法不需要顯式使用 catch-and-throw 塊來處理這些未經檢查的異常。 一些繼承未經檢查的運行時異常的類包括——NullPointerException、ArithmeticException 等。

讓我們看一段拋出 NullPointerException unchecked Exception 的 Java 代碼,它不像前面那樣在這段代碼中處理。 這裡是:

公共無效 writeToFile() {

嘗試(BufferedWriter b_w = null){

b_w.write(“測試”);

} 捕捉(IOException ioe){

ioe.printStackTrace();

}

}

當您調用上述方法時,由於 BufferedWriter 對象為空,程序將拋出 NullPointerException。 以下是異常的內容:

線程“主”java.lang.NullPointerException 中的異常

在 IOExceptionExample.writeToFile(IOExceptionExample.java:10)

在 IOExceptionExample.main(IOExceptionExample.java:17)

綜上所述

至此,我們到了這篇關於理解 Java 異常層次結構的博客的結尾。 請記住,這絕不是全面介紹 Java 中的異常以及如何處理它們。 為此,您應該深入挖掘並將自己暴露於不同的可能異常,以了解它們是如何工作的。 了解異常處理將使您成為一名成功的全棧開發人員,因為異常是任何應用程序的基礎。

在 upGrad,我們有專門的全棧開發課程 -軟件開發執行 PG 計劃 - 全棧開發專業化- 我們主要關注全棧開發,帶您了解軟件開發的所有細微差別。 我們建議您查看課程並可能盡快預訂座位!

1. 哪個類出現在 Java 異常層次結構的頂部?

Throwable 類位於 Java 異常層次結構的頂部。

2. Java 中存在哪些不同類型的異常?

Java 有未經檢查和檢查的異常。 Checked Exceptions 也稱為編譯時異常,而 Unchecked Exceptions 也稱為運行時異常。

3、Java中的異常是如何處理的?

try-catch 是在 Java 中處理異常的最簡單方法。 您要運行的主要代碼段需要放在 try 塊中,而一個或多個 catch 塊將捕獲代碼拋出的所有異常。 此方法將檢測拋出的任何類型的 Java 異常。