最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從Throwable到自定義深度解析Java中的異常體系

 更新時間:2026年05月27日 08:34:33   作者:身如柳絮隨風(fēng)揚(yáng)  
異常處理是?Java?編程中不可繞過的一環(huán),本文將帶你重新理解?Java?異常體系,從?Throwable?頂層類開始,層層剖析,并結(jié)合流程圖和對比表格,讓你徹底搞懂

1. 引言

異常處理是 Java 編程中不可繞過的一環(huán)。無論是處理用戶輸入錯誤、網(wǎng)絡(luò)連接失敗,還是預(yù)防空指針異常,一套完善的異常處理機(jī)制都能極大提升程序的健壯性和可維護(hù)性。然而,許多開發(fā)者對 Java 異常體系的認(rèn)知僅僅停留在“try-catch-finally”層面,對于 checked 異常unchecked 異常 的區(qū)別、Error 與 Exception 的本質(zhì)差異卻模糊不清。

本文將帶你重新理解 Java 異常體系,從 Throwable 頂層類開始,層層剖析,并結(jié)合流程圖和對比表格,讓你徹底搞懂:

  • 異常體系的完整繼承關(guān)系
  • Error、Exception 的區(qū)分及典型子類
  • RuntimeException 與 checked 異常的核心區(qū)別
  • 如何正確捕獲和處理異常
  • 自定義異常的最佳實(shí)踐

2. 異常體系全景圖(UML 類圖)

Java 中所有異常和錯誤的根類是 java.lang.Throwable,其下分為兩大分支:ErrorException。

圖注

  • Error 表示嚴(yán)重系統(tǒng)錯誤,程序通常無法恢復(fù),不應(yīng)捕獲。
  • Exception 分為 checked 異常(如 IOException)和 unchecked 異常RuntimeException 及其子類)。
  • RuntimeException 及其子類代表編程錯誤,不強(qiáng)制處理。

3. Throwable:一切異常與錯誤的祖宗

Throwable 是所有異常和錯誤類型的父類,它提供了異常信息的核心方法:

  • getMessage():返回異常的詳細(xì)描述字符串。
  • printStackTrace():打印調(diào)用棧,便于調(diào)試。
  • getCause():獲取引發(fā)當(dāng)前異常的原因(鏈?zhǔn)疆惓#?/li>

4. Error:系統(tǒng)級災(zāi)難

Error 及其子類代表 嚴(yán)重系統(tǒng)問題,通常由 JVM 或底層硬件引發(fā),應(yīng)用程序不應(yīng)該嘗試捕獲或處理,因?yàn)榧词共东@也無法恢復(fù)。常見 Error 子類:

異常類含義典型場景
OutOfMemoryError內(nèi)存耗盡創(chuàng)建過多對象、內(nèi)存泄漏、堆過小
StackOverflowError棧溢出遞歸調(diào)用過深、方法調(diào)用層次過多
NoClassDefFoundError類定義找不到編譯時存在但運(yùn)行時缺少 class 文件
LinkageError鏈接錯誤類依賴版本沖突(如 NoSuchMethodError
// 示例:遞歸導(dǎo)致 StackOverflowError
public static void recursive() {
    recursive();   // 無限遞歸
}
// 輸出:Exception in thread "main" java.lang.StackOverflowError

5. Exception:可處理的異常

Exception 是程序運(yùn)行中可預(yù)見的意外情況,分為兩大類。

5.1 RuntimeException(非受檢異常)

RuntimeException 及其子類屬于 unchecked exception(非受檢異常)。它們通常由編程錯誤引發(fā),如邏輯錯誤、使用不當(dāng)?shù)?。編譯器不強(qiáng)制要求處理它們(不要求 try-catch 或 throws)。

常見子類含義觸發(fā)場景
NullPointerException空指針異常調(diào)用 null 對象的方法
ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越界訪問數(shù)組索引超出范圍
ArithmeticException算術(shù)異常整數(shù)除零
IllegalArgumentException非法參數(shù)異常傳遞不合法參數(shù)給方法
ClassCastException類型轉(zhuǎn)換異常強(qiáng)制類型轉(zhuǎn)換失敗
// 不強(qiáng)制處理,但可自行捕獲
int[] arr = new int[3];
System.out.println(arr[5]);   // 運(yùn)行時拋出 ArrayIndexOutOfBoundsException

5.2 非 RuntimeException(受檢異常)

除了 RuntimeException 及其子類,其他 Exception 都是 checked exception(受檢異常)。編譯器強(qiáng)制要求處理——要么 try-catch 包裹,要么方法簽名上 throws 聲明。常見受檢異常:

異常類含義典型場景
IOException輸入輸出異常文件不存在、網(wǎng)絡(luò)讀寫失敗
ClassNotFoundException類未找到異常使用 Class.forName() 加載不存在的類
SQLException數(shù)據(jù)庫操作異常JDBC 連接失敗、SQL 語法錯誤
InterruptedException線程中斷異常調(diào)用 Thread.sleep() 時被中斷
// 必須處理(要么 try-catch,要么 throws)
public void readFile() throws IOException {
    FileReader fr = new FileReader("test.txt");  // 可能拋出 FileNotFoundException
}

6. Checked vs Unchecked:核心區(qū)別

維度Checked ExceptionUnchecked Exception (RuntimeException)
編譯檢查必須處理(try-catch 或 throws)不強(qiáng)制處理,可選
繼承關(guān)系繼承 Exception 但不繼承 RuntimeException繼承 RuntimeException
常見例子IOException, SQLException, ClassNotFoundExceptionNullPointerException, ArrayIndexOutOfBoundsException
根源外部環(huán)境錯誤(用戶輸入、文件系統(tǒng)、網(wǎng)絡(luò))編程邏輯錯誤(空指針、越界)
恢復(fù)可能性通??芍卦嚮蛱崾居脩?/td>一般不可恢復(fù),應(yīng)盡早暴露(如通過單元測試)
設(shè)計(jì)傾向要求調(diào)用者顯式處理,增強(qiáng)健壯性不強(qiáng)制處理,減少代碼冗余

處理方式對比

// Checked 異常:必須處理
try {
    Class.forName("com.example.NotFound");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

// Unchecked 異常:可以不處理,但也可以捕獲
String s = null;
if (s != null) {    // 主動檢查,避免 NPE
    s.length();
}
// 或 try-catch(不推薦,掩蓋錯誤)
try {
    s.length();
} catch (NullPointerException e) {
    System.out.println("caught NPE");
}

7. 異常處理最佳實(shí)踐

7.1 捕獲異常的原則

  • 不要捕獲 Error:如 OutOfMemoryError,捕獲后也無法恢復(fù)。
  • 不要吞掉異常:空 catch 塊會使錯誤靜默消失,極難調(diào)試。
  • 精確捕獲:避免 catch (Exception e) 這種萬金油,應(yīng)捕獲具體子類。
  • 使用 finally 釋放資源:確保 I/O、數(shù)據(jù)庫連接等被關(guān)閉(Java 7+ 可用 try-with-resources)。

7.2 拋出異常的原則

  • 早拋晚捕:方法內(nèi)發(fā)現(xiàn)錯誤立即拋出,由上層統(tǒng)一處理。
  • 使用自定義異常:為業(yè)務(wù)錯誤定義有意義的異常類型(繼承 ExceptionRuntimeException)。
  • 包裝異常:使用 throw new MyBusinessException(e) 保留原始異常鏈。

7.3 自定義異常示例

// 受檢業(yè)務(wù)異常
public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

// 非受檢參數(shù)異常
public class InvalidUserInputException extends RuntimeException {
    public InvalidUserInputException(String message) {
        super(message);
    }
}

8. 異常處理流程圖(try-catch-finally)

9. 常見誤區(qū)與面試題

Q1:Error和Exception能混為一談嗎?

不能。Error 通常表示 JVM 內(nèi)部錯誤,應(yīng)用程序無法恢復(fù);Exception 表示程序運(yùn)行中的意外情況,應(yīng)用程序應(yīng)當(dāng)處理。

Q2:RuntimeException也是Exception的子類,為什么它不受檢查?

因?yàn)?RuntimeException 代表編程錯誤(如空指針、越界),這類問題應(yīng)該在代碼層面預(yù)防(如判空),而不是在每個調(diào)用處都用 try-catch 包裹。Java 設(shè)計(jì)者認(rèn)為強(qiáng)制處理會帶來不必要的代碼膨脹。

Q3:ClassNotFoundException是 checked 異常還是 unchecked?

它是 Exception 的直接子類(不繼承 RuntimeException),所以是 checked 異常,必須處理。

Q4: 可以拋出Throwable嗎?

語法上允許 throw new Throwable(),但極度不推薦,因?yàn)?Throwable 包含 Error,可能導(dǎo)致捕獲到不該捕獲的嚴(yán)重錯誤。

10. 總結(jié)與記憶表

分類是否強(qiáng)制處理典型代表處理建議
Error否(不應(yīng)捕獲)OutOfMemoryError, StackOverflowError記錄日志后讓程序退出
RuntimeException否(可選)NullPointerException, IllegalArgumentException主動判空、邊界檢查等防御編程
其他 Exception是(必須)IOException, SQLException, ClassNotFoundExceptiontry-catch 處理或 throws 向上傳遞

最后總結(jié)

  • Error:JVM 的錯,程序無責(zé)任。
  • RuntimeException:程序員的錯,應(yīng)在代碼中預(yù)防。
  • **checked 異常:環(huán)境的錯,必須顯式處理。

掌握 Java 異常體系,能讓你在編寫健壯程序時更加得心應(yīng)手。下一次當(dāng)你在 catch 塊中犯愁時,不妨想一想:這個異常是應(yīng)該修復(fù)代碼(unchecked),還是妥善處理外部錯誤(checked)?

到此這篇關(guān)于從Throwable到自定義深度解析Java中的異常體系的文章就介紹到這了,更多相關(guān)Java異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中executeQuery()和executeUpdate()的區(qū)別及說明

    Java中executeQuery()和executeUpdate()的區(qū)別及說明

    executeQuery()和executeUpdate()是JDBC中用于執(zhí)行SQL語句的方法,前者用于執(zhí)行查詢語句,返回ResultSet對象;后者用于執(zhí)行修改操作,返回受影響的行數(shù),使用這些方法時需要注意SQL語句的正確性、資源的釋放以及防止SQL注入
    2025-11-11
  • Elasticsearch索引結(jié)構(gòu)與算法解析

    Elasticsearch索引結(jié)構(gòu)與算法解析

    ?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點(diǎn),那么ES是如何達(dá)到“搜索引擎”級別的查詢效率呢?首先是索引,其次是壓縮算法,接下來我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法
    2023-04-04
  • java 可重啟線程及線程池類的設(shè)計(jì)(詳解)

    java 可重啟線程及線程池類的設(shè)計(jì)(詳解)

    下面小編就為大家?guī)硪黄猨ava 可重啟線程及線程池類的設(shè)計(jì)(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring的事件機(jī)制知識點(diǎn)詳解及實(shí)例分析

    Spring的事件機(jī)制知識點(diǎn)詳解及實(shí)例分析

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于Spring的事件機(jī)制知識點(diǎn)詳解及實(shí)例分析,有需要的朋友么可以參考下。
    2021-12-12
  • 如何簡單使用mybatis注解

    如何簡單使用mybatis注解

    之前我們介紹了使用JDBC或者java框架mabatis來實(shí)現(xiàn)對數(shù)據(jù)庫的操作,現(xiàn)在為了簡化代碼,提高程序的簡潔性,我們探索如何使用注解進(jìn)行開發(fā),需要的朋友可以參考下
    2021-06-06
  • Java中關(guān)于String的兩種賦值方式

    Java中關(guān)于String的兩種賦值方式

    這篇文章主要介紹了Java中關(guān)于String的兩種賦值方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java判斷回文數(shù)示例分享

    java判斷回文數(shù)示例分享

    這篇文章主要介紹了java判斷回文數(shù)示例,需要的朋友可以參考下
    2014-03-03
  • Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(fèi)(以ribbon為例)

    Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(fèi)(以ribbon為例)

    這篇文章主要介紹了Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(fèi)(以ribbon為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • spring boot和spring cloud之間的版本關(guān)系

    spring boot和spring cloud之間的版本關(guān)系

    這篇文章主要介紹了spring boot和spring cloud之間的版本關(guān)系,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • elasticsearch集群查詢超10000的解決方案

    elasticsearch集群查詢超10000的解決方案

    ES為了避免用戶的過大分頁請求造成ES服務(wù)所在機(jī)器內(nèi)存溢出,默認(rèn)對深度分頁的條數(shù)進(jìn)行了限制,默認(rèn)的最大條數(shù)是10000條,這篇文章主要給大家介紹了關(guān)于elasticsearch集群查詢超10000的解決方案,需要的朋友可以參考下
    2024-08-08

最新評論

中西区| 乡宁县| 绥化市| 淅川县| 松滋市| 瑞金市| 新密市| 淳化县| 漳平市| 左权县| 武城县| 承德县| 千阳县| 瑞丽市| 秭归县| 泰州市| 淮北市| 岳阳县| 茂名市| 西吉县| 邵阳县| 城口县| 临沧市| 蓝田县| 绍兴市| 罗江县| 乌鲁木齐市| 邹平县| 渝中区| 闽侯县| 淅川县| 乐陵市| 塘沽区| 夏河县| 石门县| 徐闻县| 沈阳市| 禄丰县| 日喀则市| 通江县| 格尔木市|