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

一篇文章詳解Java異常處理

 更新時(shí)間:2023年12月18日 11:58:27   作者:cccc楚染rrrr  
異常處理是編程語(yǔ)言或計(jì)算機(jī)硬件里的一種機(jī)制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正常執(zhí)行流程的某些特殊條件),這篇文章主要給大家介紹了關(guān)于Java異常處理的相關(guān)資料,需要的朋友可以參考下

Java異常的三種分類(lèi)

  1. 受檢異常(Checked Exceptions):最具代表性的是用戶錯(cuò)誤和問(wèn)題引起的異常,程序員無(wú)法遇見(jiàn),這些異常在編譯時(shí)強(qiáng)制要求進(jìn)行處理,比如打開(kāi)一個(gè)不存在的文件。如果一個(gè)方法可能會(huì)引發(fā)受檢異常,要么在方法簽名中使用throws子句聲明,要么使用try-catch塊捕獲并處理這些異常。例如,IOException就是一個(gè)受檢異常,它需要在代碼中進(jìn)行顯式處理。
  2. 運(yùn)行時(shí)異常(Runtime Exceptions):這些異常是RuntimeException類(lèi)及其子類(lèi)的實(shí)例。與受檢異常不同,編譯時(shí)會(huì)被忽略,運(yùn)行時(shí)異常不需要顯式地捕獲或聲明。常見(jiàn)的運(yùn)行時(shí)異常包括NullPointerException、ArrayIndexOutOfBoundsException和ArithmeticException等。
  3. 錯(cuò)誤(Errors):錯(cuò)誤通常指示了嚴(yán)重的問(wèn)題,大多數(shù)情況下是程序無(wú)法處理的。與異常不同,錯(cuò)誤通常不應(yīng)該被捕獲和處理。常見(jiàn)的錯(cuò)誤包括StackOverflowError和OutOfMemoryError等。

異常體系結(jié)構(gòu)

Java的異常體系結(jié)構(gòu)是基于Throwable類(lèi)的,java.lang.Throwable作為所有異常的超類(lèi)

Error

Error類(lèi)是Java編程語(yǔ)言中表示嚴(yán)重問(wèn)題的基類(lèi)之一。

在Java中,Error對(duì)象表示的是系統(tǒng)級(jí)的錯(cuò)誤和運(yùn)行時(shí)環(huán)境的問(wèn)題,通常由Java虛擬機(jī)(JVM)生成和拋出。

與一般的異常不同,Error及其子類(lèi)通常表示虛擬機(jī)自身的問(wèn)題,而不是應(yīng)用程序的問(wèn)題。

一些常見(jiàn)的Error子類(lèi)包括:

  • OutOfMemoryError:當(dāng)JVM無(wú)法再分配內(nèi)存時(shí)拋出,表示內(nèi)存耗盡。
  • StackOverflowError:當(dāng)方法調(diào)用的層級(jí)太深,導(dǎo)致??臻g耗盡時(shí)拋出。
  • NoClassDefFoundError:當(dāng)JVM或ClassLoader無(wú)法找到所需的類(lèi)定義時(shí)拋出。
  • InternalError:表示JVM內(nèi)部發(fā)生了嚴(yán)重錯(cuò)誤。

Exception

Exception類(lèi)是Java編程語(yǔ)言中表示一般意外情況或錯(cuò)誤的基類(lèi)之一。

在Java中,Exception及其子類(lèi)通常用于表示程序運(yùn)行過(guò)程中可能發(fā)生的各種異常情況。

Exception類(lèi)的直接子類(lèi)主要分為兩種:

  • Checked Exception:這些異常必須在代碼中進(jìn)行處理,要么通過(guò)try-catch塊捕獲和處理,要么通過(guò)throws子句聲明向上傳播。
  • RuntimeException:這些異常通常是由程序錯(cuò)誤引起的,不要求在代碼中強(qiáng)制處理。

一些常見(jiàn)的 Checked Exception:

  1. IOException:用于表示輸入輸出操作中可能發(fā)生的異常情況,如文件未找到、文件權(quán)限問(wèn)題等。
  2. SQLException:用于表示與數(shù)據(jù)庫(kù)訪問(wèn)相關(guān)的異常,例如連接問(wèn)題、查詢問(wèn)題等。
  3. ClassNotFoundException:用于表示在運(yùn)行時(shí)找不到特定類(lèi)的異常。
  4. FileNotFoundException:指示嘗試打開(kāi)指定文件名的文件失敗。
  5. ParseException:用于表示解析操作中可能發(fā)生的異常,例如日期解析錯(cuò)誤。
  6. NoSuchMethodException:指示嘗試訪問(wèn)不存在的方法時(shí)發(fā)生的異常。

一些常見(jiàn)的 RuntimeException:

  1. NullPointerException:當(dāng)應(yīng)用程序試圖在要求使用對(duì)象的地方使用 null 時(shí),拋出該異常。
  2. ArrayIndexOutOfBoundsException:用于指示數(shù)組索引超出范圍。
  3. ArithmeticException:表示在算術(shù)運(yùn)算中發(fā)生的異常情況,例如除以零。
  4. IllegalArgumentException:指示向方法傳遞了一個(gè)不合法或不正確的參數(shù)。
  5. IllegalStateException:表示對(duì)象的狀態(tài)不適合請(qǐng)求的操作。
  6. ClassCastException:當(dāng)試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類(lèi)時(shí),拋出該異常。

異常處理機(jī)制

1、try-catch塊:try 用于包裹可能會(huì)引發(fā)異常的代碼塊,catch 用于捕獲并處理特定類(lèi)型的異常。如果 try 塊中的代碼引發(fā)了異常,Java 將會(huì)跳到匹配的 catch 塊中執(zhí)行相應(yīng)的處理代碼。

try {  
    // 可能引發(fā)異常的代碼  
} catch (ExceptionType e) {  
    // 處理異常的代碼  
}  

2、finally塊:finally 塊中的代碼總是會(huì)被執(zhí)行,無(wú)論是否發(fā)生異常。通常用于確保資源的釋放,如關(guān)閉文件或網(wǎng)絡(luò)連接。

try {  
    // 可能引發(fā)異常的代碼  
} catch (ExceptionType e) {  
    // 處理異常的代碼  
} finally {  
    // 無(wú)論是否發(fā)生異常都會(huì)執(zhí)行的代碼  
}  

3、throws關(guān)鍵字:throws 用于在方法聲明中指定可能會(huì)拋出的異常,將異常的處理責(zé)任交給調(diào)用者。這就是告訴調(diào)用者,調(diào)用這個(gè)方法時(shí),需要考慮到可能會(huì)拋出的異常情況。

void someMethod() throws SomeException {  
    // 方法可能拋出 SomeException  
}  
void readFile() throws IOException {  
    // 讀取文件的代碼  
}  

在這個(gè)例子中,readFile 方法聲明了可能會(huì)拋出 IOException 異常。當(dāng)其他代碼調(diào)用 readFile 方法時(shí),調(diào)用者需要考慮到可能會(huì)出現(xiàn) IOException 異常的情況。

4、throw關(guān)鍵字:throw 用于手動(dòng)拋出一個(gè)異常。這意味著當(dāng)程序執(zhí)行到 throw 語(yǔ)句時(shí),會(huì)創(chuàng)建一個(gè)異常對(duì)象并將其拋出。這個(gè)異常可以是 Java 標(biāo)準(zhǔn)庫(kù)中已經(jīng)定義好的異常類(lèi)型,也可以是你自己定義的異常類(lèi)型。

if (someCondition) {  
    throw new SomeException("Error message");  
}  

舉個(gè)例子,假設(shè)你正在編寫(xiě)一個(gè)函數(shù),需要檢查傳入的參數(shù)是否滿足某些條件,如果條件不滿足,你可以使用 throw 拋出一個(gè)異常來(lái)中斷程序的執(zhí)行并給出相應(yīng)的提示或錯(cuò)誤信息。

void checkAge(int age) {  
    if (age < 0) {  
        throw new IllegalArgumentException("Age cannot be negative");  
    }  
}  

在這個(gè)例子中,如果傳入的年齡是負(fù)數(shù),throw 語(yǔ)句將會(huì)創(chuàng)建一個(gè) IllegalArgumentException 異常對(duì)象并將其拋出。

5、自定義異常:可以通過(guò)擴(kuò)展 Exception 類(lèi)或其子類(lèi)來(lái)創(chuàng)建自定義異常類(lèi),以便應(yīng)用程序可以根據(jù)特定的需求創(chuàng)建和使用異常類(lèi)型。

如果不加throws MyException會(huì)報(bào)錯(cuò),這是因?yàn)椋涸贘ava中,如果一個(gè)方法可能拋出已檢查異常(checked exception),但沒(méi)有使用try-catch塊捕獲該異常,也沒(méi)有使用throws子句將該異常傳播出去,編譯器會(huì)報(bào)錯(cuò)。

幾種異常處理方式的區(qū)別:

  • throw 用于手動(dòng)拋出異常,throws 用于聲明可能會(huì)拋出的異常類(lèi)型,而 try-catch 用于實(shí)際處理異常情況。
  • throw 和 try-catch 是用于實(shí)際處理異常的,而 throws 是在方法聲明中指明可能會(huì)拋出的異常類(lèi)型。

舉例:

import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
  
public class FileHandlingExample {  
    public static void main(String[] args) {  
        BufferedReader reader = null;  
        try {  
            reader = new BufferedReader(new FileReader("example.txt"));  
            String line = reader.readLine();  
            int number = Integer.parseInt(line);  
            System.out.println("Read number: " + number);  
        } catch (FileNotFoundException e) {  
            System.err.println("File not found: " + e.getMessage());  
        } catch (NumberFormatException e) {  
            System.err.println("Invalid number format: " + e.getMessage());  
        } catch (IOException e) {  
            System.err.println("IOException: " + e.getMessage());  
        } finally {  
            try {  
                if (reader != null) {  
                    reader.close();  
                }  
            } catch (IOException e) {  
                System.err.println("Error while closing the reader: " + e.getMessage());  
            }  
        }  
    }  
}  

在這個(gè)例子中,我們嘗試打開(kāi)一個(gè)文件并讀取其中的內(nèi)容。在 try 塊中,我們打開(kāi)文件并嘗試讀取文件中的一行內(nèi)容,并將其轉(zhuǎn)換為整數(shù)。在 catch 塊中,我們分別捕獲了 FileNotFoundException(文件未找到)、NumberFormatException(無(wú)效的數(shù)字格式)和 IOException(輸入輸出異常)。

finally 塊中,我們確保關(guān)閉了文件讀取器,即使在 trycatch 塊中發(fā)生了異常,也會(huì)執(zhí)行這一步。這是非常重要的,因?yàn)樗_保資源得到了正確的釋放。

Java 編譯器會(huì)按照 catch 塊的順序來(lái)匹配異常,而一旦找到了匹配的 catch 塊,后續(xù)的 catch 塊將不再執(zhí)行。 因此,如果將最一般的異常類(lèi)型放在最前面,那么可能會(huì)導(dǎo)致后續(xù)的 catch 塊永遠(yuǎn)無(wú)法執(zhí)行。

在前面提供的示例代碼中,我們先捕獲了 FileNotFoundException,然后是 NumberFormatException,最后是 IOException。這是符合最佳實(shí)踐的順序。

如果按照相反的順序,即先捕獲 IOException,然后是 NumberFormatException,最后是 FileNotFoundException,那么由于 IOExceptionFileNotFoundExceptionNumberFormatException 的父類(lèi),IOException 的 catch 塊將會(huì)捕獲到所有這些異常,而后續(xù)的 catch 塊將無(wú)法執(zhí)行。

因此,捕獲異常時(shí)應(yīng)該遵循從最具體的異常類(lèi)型到最一般的異常類(lèi)型的順序,以確保程序能夠按預(yù)期進(jìn)行異常處理。

書(shū)寫(xiě)異常處理語(yǔ)句的快捷鍵:ctrl+alt(option)+T

手動(dòng)結(jié)束程序語(yǔ)句:

實(shí)際使用中的經(jīng)驗(yàn)總結(jié):

  1. 處理運(yùn)行時(shí)異常時(shí),采用邏輯去合理規(guī)避同時(shí)輔助try-catch處理
  2. 在多重catch塊后面,可以加上一個(gè)catch(Exception)來(lái)處理可能會(huì)被遺漏的異常
  3. 對(duì)于不確定的代碼,也可以加上try-catch處理異常
  4. 盡量去處理異常,切忌僅使用printStackTrace()打印輸出
  5. 具體處理異常,根據(jù)業(yè)務(wù)需求和異常類(lèi)型的不同決定
  6. 盡量添加finally釋放占用的資源(IO、Scanner)

總結(jié)

到此這篇關(guān)于一篇文章詳解Java異常處理的文章就介紹到這了,更多相關(guān)Java異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot aspect通過(guò)@annotation進(jìn)行攔截的實(shí)例代碼詳解

    springboot aspect通過(guò)@annotation進(jìn)行攔截的實(shí)例代碼詳解

    這篇文章主要介紹了springboot aspect通過(guò)@annotation進(jìn)行攔截的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • servlet實(shí)現(xiàn)文件上傳與下載功能

    servlet實(shí)現(xiàn)文件上傳與下載功能

    這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件上傳與下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java項(xiàng)目中獲取路徑的絕對(duì)路徑問(wèn)題和相對(duì)路徑問(wèn)題

    Java項(xiàng)目中獲取路徑的絕對(duì)路徑問(wèn)題和相對(duì)路徑問(wèn)題

    這篇文章主要介紹了如何Java項(xiàng)目中獲取文件地址,在 Java 項(xiàng)目中我們經(jīng)常會(huì)讀取配置文件,但是文件的路徑在獲取時(shí)我們是怎么得到的?下面我們就一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧,需要的朋友可以參考下
    2022-02-02
  • FeignClient實(shí)現(xiàn)接口調(diào)用方式(不同參數(shù)形式)

    FeignClient實(shí)現(xiàn)接口調(diào)用方式(不同參數(shù)形式)

    這篇文章主要介紹了FeignClient實(shí)現(xiàn)接口調(diào)用方式(不同參數(shù)形式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot集成支付寶沙箱支付的實(shí)現(xiàn)示例

    SpringBoot集成支付寶沙箱支付的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成支付寶沙箱支付的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Spring DevTools的介紹

    Spring DevTools的介紹

    今天小編就為大家分享一篇關(guān)于Spring DevTools的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 深入分析JAVA Synchronized關(guān)鍵字

    深入分析JAVA Synchronized關(guān)鍵字

    這篇文章主要介紹了析JAVA Synchronized關(guān)鍵字的相關(guān)知識(shí),文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用案例詳解

    JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用案例詳解

    通過(guò) JdbcTemplate 直接執(zhí)行 SQL 語(yǔ)句,結(jié)合源碼動(dòng)態(tài)編譯即可方便實(shí)現(xiàn)動(dòng)態(tài)修改代碼邏輯的效果,這篇文章主要介紹了JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用,需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)將Word文檔轉(zhuǎn)換為密碼保護(hù)的PDF文件

    Java實(shí)現(xiàn)將Word文檔轉(zhuǎn)換為密碼保護(hù)的PDF文件

    在數(shù)字化辦公中,Word文檔的安全共享常面臨挑戰(zhàn),本文將借助Spire.Doc for Java庫(kù),實(shí)現(xiàn)Word文檔到加密PDF的無(wú)縫轉(zhuǎn)換,確保敏感內(nèi)容的分發(fā)安全,滿足企業(yè)級(jí)文檔管理的合規(guī)需求,有需要的可以參考下
    2025-10-10
  • 解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問(wèn)題

    解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問(wèn)題

    這篇文章主要介紹了idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問(wèn)題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

分宜县| 丹棱县| 盖州市| 高碑店市| 昆明市| 霸州市| 苍梧县| 横峰县| 鲜城| 华池县| 胶南市| 沐川县| 名山县| 苍山县| 镇平县| 晋城| 宁德市| 浦东新区| 锦屏县| 克拉玛依市| 新和县| 白水县| 梅州市| 怀远县| 龙川县| 华阴市| 通辽市| 安多县| 茂名市| 桐庐县| 方城县| 蒙山县| 威信县| 西峡县| 大埔县| 青川县| 甘肃省| 旬邑县| 疏勒县| 合水县| 深州市|