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

一文詳解Java中三大異常處理方式(try-catch、throw、throws)

 更新時(shí)間:2026年01月11日 15:25:55   作者:只有Java懂我  
這篇文章主要介紹了Java中三大異常處理方式的相關(guān)資料,分別是try-catch、throw、throws,try-catch、throw、throws,try-catch用于捕獲和處理異常,throw用于顯式拋出異常,throws用于聲明方法可能拋出的異常,需要的朋友可以參考下

前言

這三種方式(try-catch、throw、throws)是 Java 異常處理的三大基石。要搞懂它們,最重要的是明白它們分別處于異常處理流程中的哪個環(huán)節(jié)

1. try-catch:自己處理(捕獲與解決)

這是 Java 處理異常最直接的方式,用于在代碼內(nèi)部捕獲異常并進(jìn)行處理,從而保證程序能繼續(xù)運(yùn)行。

  • 定義位置:方法體內(nèi)部。
  • 結(jié)構(gòu)組成:由 try 塊和一個或多個 catch 塊組成(還可以包含 finally 塊)。
  • 執(zhí)行邏輯
    1. try 塊:包裹可能拋出異常的代碼段。程序正常執(zhí)行時(shí),逐行執(zhí)行 try 塊內(nèi)的代碼。
    2. 異常觸發(fā):如果 try 塊中的某行代碼拋出異常,try 塊中剩余的代碼將不再執(zhí)行,程序立即跳轉(zhuǎn)到與異常類型匹配的 catch 塊。
    3. catch 塊:捕獲特定類型的異常對象。在 catch 塊中編寫處理該異常的邏輯(如日志記錄、恢復(fù)操作、提示用戶等)。如果沒有異常發(fā)生,catch 塊將被跳過。
  • 作用:將異常處理邏輯與正常業(yè)務(wù)邏輯分離,防止因異常導(dǎo)致程序非正常終止。

語法詳解

try {
    // 1. try 塊:放可能出現(xiàn)問題的代碼( risky code )
    int result = 10 / 0; // 這里會拋出 ArithmeticException 異常
    System.out.println("這行代碼不會執(zhí)行,因?yàn)樯厦娉鲥e了");
} catch (ArithmeticException e) {
    // 2. catch 塊:如果 try 里的代碼真的出錯了,就會跳到這里來執(zhí)行
    System.out.println("哎呀,除數(shù)不能為0!補(bǔ)救措施:把除數(shù)改為1");
    
    // e 就是捕獲到的那個異常對象,你可以用它打印錯誤信息
    e.printStackTrace(); 
}
System.out.println("程序繼續(xù)運(yùn)行...");
  • 關(guān)鍵點(diǎn)
    • try:監(jiān)控代碼。
    • catch:匹配異常類型(如 ArithmeticException)。如果 try 里拋出的異常和 catch 括號里的類型一致(或是其子類),就進(jìn)入 catch 塊執(zhí)行。
    • 執(zhí)行順序:一旦 try 中某行出錯,直接跳過 try 剩余代碼,進(jìn)入對應(yīng)的 catch。
    • 多重 catch:你可以寫多個 catch 來處理不同的異常,就像準(zhǔn)備不同的急救包。

補(bǔ)充:

finally:最終執(zhí)行塊

  • 定義:位于 try-catch 結(jié)構(gòu)之后的代碼塊。
  • 核心特性:無論 try 塊中是否發(fā)生異常,也無論是否執(zhí)行了 return 語句,finally 塊中的代碼一定會執(zhí)行。
  • 主要作用:用于資源釋放。通常在代碼執(zhí)行完畢后,關(guān)閉文件流、數(shù)據(jù)庫連接或釋放鎖,確保不占用系統(tǒng)資源。
  • 唯一例外:如果在 trycatch 中執(zhí)行了 System.exit(0) 強(qiáng)制終止 JVM,或者發(fā)生了斷電宕機(jī),finally 才不會執(zhí)行。

2. throw:主動制造(拋出異常)

這是一個動作關(guān)鍵字,用于在代碼中顯式地生成并拋出一個異常對象。它不是“處理”異常,而是“制造”異常。

  • 定義位置:方法體或代碼塊內(nèi)部。
  • 操作對象:后面必須跟一個 Throwable 類及其子類的實(shí)例化對象。
  • 執(zhí)行邏輯
    1. 程序執(zhí)行到 throw 語句時(shí),會立即停止當(dāng)前方法的后續(xù)代碼執(zhí)行。
    2. 它將創(chuàng)建的異常對象拋出給 Java 運(yùn)行時(shí)系統(tǒng)。
    3. 如果該 throw 語句未包裹在 try-catch 塊中,或者 catch 塊未捕獲該異常,則該方法將立即結(jié)束,并將異常拋給該方法的調(diào)用者。
  • 作用:通常用于業(yè)務(wù)邏輯校驗(yàn)。當(dāng)程序狀態(tài)不符合預(yù)期(如參數(shù)非法、狀態(tài)錯誤)時(shí),主動中斷流程并向上層報(bào)告錯誤。

語法詳解

public void checkAge(int age) {
    // 邏輯判斷:如果年齡是負(fù)數(shù),這不符合邏輯
    if (age < 0) {
        // 主動創(chuàng)建一個異常對象,并用 throw 關(guān)鍵字拋出
        // 就像你主動點(diǎn)燃了引信,扔出手雷
        throw new IllegalArgumentException("年齡不能是負(fù)數(shù)!");
    }
    
    System.out.println("年齡檢查通過:" + age);
}
  • 關(guān)鍵點(diǎn)
    • throw 寫在方法內(nèi)部。
    • throw 后面必須跟一個異常對象new ...)。
    • 一旦執(zhí)行到 throw,當(dāng)前方法立即結(jié)束(就像遇到 return 一樣),后面的代碼不再執(zhí)行,控制權(quán)交給調(diào)用者。

3. throws:聲明推卸(聲明異常)

這是一個聲明關(guān)鍵字,用在方法簽名上。它表示當(dāng)前方法不處理某些異常,而是將異常的處理責(zé)任推給調(diào)用該方法的上層代碼。

  • 定義位置:方法聲明中,參數(shù)列表之后,方法體之前。
  • 操作對象:后面跟異常類名(可以多個,用逗號分隔),不是對象實(shí)例。
  • 執(zhí)行邏輯
    1. 聲明該方法在執(zhí)行過程中可能會拋出指定類型的異常。
    2. 當(dāng)調(diào)用者調(diào)用該方法時(shí),編譯器會強(qiáng)制要求調(diào)用者必須處理這些聲明的異常(通過 try-catch 捕獲,或者在自身的聲明中使用 throws 繼續(xù)向上拋出)。
  • 作用:明確了方法的風(fēng)險(xiǎn)邊界,實(shí)現(xiàn)了異常處理的傳遞(冒泡機(jī)制),讓方法的調(diào)用者決定如何處理底層發(fā)生的異常。

語法詳解

// 在方法定義時(shí),使用 throws 關(guān)鍵字聲明可能拋出的異常列表
// 告訴調(diào)用者:調(diào)用我時(shí),可能會遇到 FileNotFoundException,你自己看著辦!
public void readFile(String filePath) throws FileNotFoundException {
    
    // 這里不需要 try-catch
    // 如果文件真的找不到,JVM 會拋出 FileNotFoundException
    // 這個異常會順著調(diào)用鏈,扔給調(diào)用 readFile 的人去處理
    FileInputStream fis = new FileInputStream(filePath); 
}
  • 調(diào)用者怎么處理?
    當(dāng)別人調(diào)用 readFile 方法時(shí),編譯器會強(qiáng)制要求調(diào)用者處理這個異常(要么 try-catch 接住,要么繼續(xù) throws 往上甩)。
public static void main(String[] args) {
    try {
        // 調(diào)用者必須用 try-catch 包裹,或者 main 方法也 throws
        readFile("test.txt");
    } catch (FileNotFoundException e) {
        System.out.println("文件沒找到,我負(fù)責(zé)處理:新建一個文件");
    }
}
  • 關(guān)鍵點(diǎn)
    • throws 寫在方法聲明后面(括號外面)。
    • 后面跟的是異常類名(可以多個,用逗號隔開),不是對象。
    • 它是一種**“甩鍋”**機(jī)制:將異常的處理責(zé)任轉(zhuǎn)移給上層調(diào)用者。

總結(jié)串聯(lián):它們是如何配合工作的?

讓我們把這三個關(guān)鍵詞串聯(lián)在一個完整的業(yè)務(wù)邏輯中:

假設(shè)我們有一個銀行轉(zhuǎn)賬的功能:

public class BankService {
    
    // 1. throws 聲明:
    //    這個方法告訴外界:“我可能會遇到錢不夠的情況,調(diào)用者要準(zhǔn)備好處理”
    public void transfer(double amount) throws InsufficientFundsException {
        
        if (amount < 0) {
            // 2. throw 拋出:
            //    程序員發(fā)現(xiàn)邏輯錯誤(轉(zhuǎn)賬金額為負(fù)),主動制造異常扔出去
            throw new IllegalArgumentException("轉(zhuǎn)賬金額不能是負(fù)數(shù)!");
        }
        
        if (balance < amount) {
            // 3. throw 拋出:
            //    發(fā)現(xiàn)余額不足,主動制造一個“余額不足異?!比映鋈?
            //    因?yàn)榉椒ê灻嫌?throws,這里可以直接扔,不用自己 catch
            throw new InsufficientFundsException("余額不足,轉(zhuǎn)賬失敗");
        }
        
        // 正??劭钸壿?..
    }
}

// 調(diào)用者
public class Main {
    public void doTransfer() {
        BankService bank = new BankService();
        
        // 4. try-catch 捕獲:
        //    因?yàn)?bank.transfer() 聲明了會扔出異常,所以這里必須接住
        try {
            bank.transfer(1000);
        } catch (InsufficientFundsException e) {
            // 處理余額不足的情況
            System.out.println("提示用戶:充值");
        } catch (IllegalArgumentException e) {
            // 處理參數(shù)錯誤的情況
            System.out.println("提示用戶:金額非法");
        }
    }
}

總結(jié)對比

關(guān)鍵字類別出現(xiàn)位置核心作用
try-catch處理機(jī)制方法體內(nèi)部攔截異常,就地解決,保證當(dāng)前流程不中斷。
throw動作方法體內(nèi)部制造異常,顯式拋出一個異常對象,中斷當(dāng)前流程。
throws聲明方法簽名上聲明異常,告知上層調(diào)用者這里可能出錯,需由調(diào)用者處理。

到此這篇關(guān)于Java中三大異常處理方式(try-catch、throw、throws)的文章就介紹到這了,更多相關(guān)Java異常處理try-catch、throw、throws內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Cloud?Gateway動態(tài)路由Apollo實(shí)現(xiàn)詳解

    Spring?Cloud?Gateway動態(tài)路由Apollo實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Spring?Cloud?Gateway動態(tài)路由通過Apollo實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析

    SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析

    這篇文章主要介紹了SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析,本文通過圖文示例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • Java 截取視頻資料中的某一幀作為縮略圖

    Java 截取視頻資料中的某一幀作為縮略圖

    最近項(xiàng)目中有一個需求,就是Java 截取視頻資料中的某一幀作為縮略圖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring?Boot項(xiàng)目中遇到`if-else`語句七種具體使用方法解析

    Spring?Boot項(xiàng)目中遇到`if-else`語句七種具體使用方法解析

    當(dāng)在Spring?Boot項(xiàng)目中遇到大量if-else語句時(shí),優(yōu)化這些代碼變得尤為重要,因?yàn)樗鼈儾粌H增加了維護(hù)難度,還可能影響應(yīng)用程序的可讀性和性能,以下是七種具體的方法,用于在Spring?Boot項(xiàng)目中優(yōu)化和重構(gòu)if-else語句,感興趣的朋友一起看看吧
    2024-07-07
  • 詳解Java枚舉與接口常量和類常量的區(qū)別

    詳解Java枚舉與接口常量和類常量的區(qū)別

    這篇文章主要為大家詳細(xì)介紹了Java中枚舉與接口常量、類常量有什么區(qū)別,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-10-10
  • 詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)

    詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)

    本篇文章主要介紹了詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 基于SpringBoot實(shí)現(xiàn)抽獎活動的四種策略

    基于SpringBoot實(shí)現(xiàn)抽獎活動的四種策略

    抽獎活動是產(chǎn)品運(yùn)營中常見的用戶激勵和互動手段,通過隨機(jī)性和獎勵刺激用戶參與度,提升用戶活躍度和留存率,在技術(shù)實(shí)現(xiàn)上,抽獎系統(tǒng)涉及到隨機(jī)算法、獎品分配、防作弊機(jī)制等多方面內(nèi)容,本文將介紹基于SpringBoot實(shí)現(xiàn)抽獎活動的5種策略,需要的朋友可以參考下
    2025-06-06
  • IDEA如何解決properties文件亂碼問題

    IDEA如何解決properties文件亂碼問題

    IDEA編輯器中打開properties文件時(shí)出現(xiàn)中文亂碼,可以通過修改文件編碼格式來解決,具體步驟為:設(shè)置》Setting》Editor》FileEncodings,將編碼格式更改為UTF-8
    2025-01-01
  • java中的instanceof關(guān)鍵字詳細(xì)解讀

    java中的instanceof關(guān)鍵字詳細(xì)解讀

    這篇文章主要介紹了java中的instanceof關(guān)鍵字詳細(xì)解讀,instanceof 是 Java 的保留關(guān)鍵字,它的作用是測試它左邊的對象是否是它右邊的類的實(shí)例,返回 boolean 的數(shù)據(jù)類型,需要的朋友可以參考下
    2024-01-01
  • SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作

    SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作

    SpringBoot中的 redistemplate 是一個用于操作 Redis 數(shù)據(jù)庫的高級模板類,它提供了一組方法,可以方便地執(zhí)行常見的 Redis 操作,如存儲、檢索和刪除數(shù)據(jù),本文給大家介紹了SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作,需要的朋友可以參考下
    2025-02-02

最新評論

平乡县| 方正县| 淮安市| 江川县| 博爱县| 勐海县| 丰宁| 漳浦县| 登封市| 年辖:市辖区| 台湾省| 兰考县| 崇仁县| 竹溪县| 三原县| 宾川县| 奉节县| 揭东县| 揭阳市| 武城县| 晋宁县| 东源县| 甘洛县| 湛江市| 宁远县| 金门县| 邯郸县| 洞头县| 清苑县| 梧州市| 敦化市| 买车| 正定县| 焉耆| 新疆| 麻城市| 高唐县| 舟曲县| 乌鲁木齐县| 青海省| 南康市|