欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你深入認(rèn)識(shí)JAVA中的異常

 更新時(shí)間:2024年06月18日 10:00:24   作者:robin_suli  
Java異常處理成為社區(qū)中討論最多的話題之一,下面這篇文章主要給大家介紹了關(guān)于JAVA中異常的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一. 異常概念與體系結(jié)構(gòu):

1 異常的概念:在 Java 中,將程序執(zhí)行過程中發(fā)生的 不正常行為 稱為異常,

如:算數(shù)異常: ArithmeticException

System.out.println(10 / 0);
// 執(zhí)行結(jié)果
Exception in thread "main" java.lang.ArithmeticException: / by zero

數(shù)組越界異常:ArrayIndexOutOfBoundsException

int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 執(zhí)行結(jié)果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100

空指針異常: NullPointerException

int[] arr = null;
System.out.println(arr.length);
// 執(zhí)行結(jié)果
Exception in thread "main" java.lang.NullPointerException

2.異常的體系結(jié)構(gòu):異常種類繁多,為了對(duì)不同異?;蛘咤e(cuò)誤進(jìn)行很好的分類管理, Java 內(nèi)部維護(hù)了一個(gè) 異常的體系結(jié)構(gòu) 如圖:

從圖中可以看出:

(1).Throwable : 是異常體系的頂層類,其派生出兩個(gè)重要的子類, Error 和 Exception

(2). Error:指的是Java虛擬機(jī)無法解決的嚴(yán)重問題,比如:JVM的內(nèi)部錯(cuò)誤、資源耗盡等,典型代表: StackOverflowError和OutOfMemoryError,一旦發(fā)生回力乏術(shù)。

(3).Exception : 異常產(chǎn)生后程序員可以通過代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。比如:感冒、發(fā)燒。我們平時(shí)所說的異常就是Exception。

OutOfMemoryError為內(nèi)存泄漏 :程序中存在未釋放的內(nèi)存資源,導(dǎo)致內(nèi)存占用不斷增加,最終導(dǎo)致內(nèi)存不足等等

StackOverflowError為:無限遞歸下去導(dǎo)致, 超出棧的容量等等

3. 異常的分類:分為 編譯時(shí)異常,  運(yùn)行時(shí)異常。

(1). 編譯時(shí)異常:  在程序 編譯期間 發(fā)生的異常,稱為 編譯時(shí)異常 ,也稱為 受檢查異常

如圖:這個(gè)重寫,克隆方法的拷貝,沒有對(duì)其捕獲或聲明

下圖則是聲明: 就編譯通過

2. 運(yùn)行時(shí)異常:

(1) 在程序 執(zhí)行期間 發(fā)生的異常,稱為運(yùn)行時(shí)異常,也稱為 非受檢查異常

(2)RunTimeException以及其子類對(duì)應(yīng)的異常,都稱為運(yùn)行時(shí)異常。

比如NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。

注意:編譯時(shí)出現(xiàn)的語法性錯(cuò)誤,不能稱之為異常。例如將 System.out.println 拼寫錯(cuò)了, 寫成了

這里也用克隆舉例子,這里沒有實(shí)現(xiàn)克隆接口,卻編譯通過了!??!

但是運(yùn)行會(huì)有異常:這就是非受查異常

二. 異常的處理:

在Java中, 異常處理主要的 5 個(gè)關(guān)鍵字: throw 、 try 、 catch 、 final 、 throws 。用好他們就,可以很好的處理異常了。

1. 異常的拋出 :在Java中,可以借助throw關(guān)鍵字,拋出一個(gè)指定的異常對(duì)象,將錯(cuò)誤信息告知給調(diào)用者

注意:

(1). throw必須寫在方法體內(nèi)部

(2). 拋出的對(duì)象必須是Exception 或者 Exception 的子類對(duì)象

(3). 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理

(4). 如果拋出的是編譯時(shí)異常,用戶必須處理,否則無法通過編譯

(5). 異常一旦拋出, 其后 的代碼就不會(huì)執(zhí)行。

如圖:這里還用了,try處理catch捕捉

public static void main(String[] args)throws ArrayIndexOutOfBoundsException {
        int[] array = new int[2];

        //捕捉異常
        try {
            //放可能發(fā)生的異常
            System.out.println(array[3]);
            System.out.println("這里不會(huì)再執(zhí)行了");

        }catch (ArrayIndexOutOfBoundsException e) {
            //捕捉異常
            System.out.println("處理了ArrayIndexOutOfBoundsException異常");
            //捕捉,打印異常
            e.printStackTrace();

        }
    }

2.異常的捕獲:異常的捕獲,也就是異常的具體處理方式,主要有兩種: 異常聲明throws 以及 try-catch捕獲處理。

拋出異常:

public static void OpenConfig(String filename) throws FileNotFoundException {

        if (filename.equals("config.ini")) {
            throw new FileNotFoundException("配置文件名字不對(duì)");
        }
    }

3.try-catch 捕獲并處理 :throws對(duì)異常并沒有真正處理,而是將異常報(bào)告給拋出異常方法的調(diào)用者,由調(diào)用者處理。如果真正要對(duì)異常進(jìn)行處理,就需要try-catch。)

此時(shí)聲明一下,然后捕獲:( 直接聲明不捕獲也可以 )

class Exception {
    File file;

    /*
    FileNotFoundException : 編譯時(shí)異常,表明文件不存在
    此處不處理,也沒有能力處理,應(yīng)該將錯(cuò)誤信息報(bào)告給調(diào)用者,讓調(diào)用者檢查文件名字是否給錯(cuò)誤了
    */
    public static void OpenConfig(String filename) throws FileNotFoundException {

        if (filename.equals("config.ini")) {
            throw new FileNotFoundException("配置文件名字不對(duì)");
        }
    }

    //捕獲
    public static void main(String[] args) {
        try {
            //將可能出現(xiàn)異常的代碼放在這里
            OpenConfig("test");
        } catch (FileNotFoundException e) {
            // 如果try中的代碼拋出異常了,此處catch捕獲時(shí)異常類型與try中拋出的異常類型一致時(shí),或者是try中拋出異常的基就會(huì)時(shí),就會(huì)被捕獲到
            e.printStackTrace();
        }finally {
            // 此處代碼一定會(huì)被執(zhí)行到,一般用來關(guān)閉文件,釋放資源
        }

    }
}

注意:1.try塊內(nèi)拋出異常位置之后的代碼將不會(huì)被執(zhí)行。

2. 如果 拋出異常類型與catch時(shí)異常類型不匹配 ,即異常不會(huì)被成功捕獲,也就不會(huì)被處理,繼續(xù)往外拋 ,直到 JVM收到后中斷程序。 (一般寫法是,用父類異常在最后面兜底)

4.finally:

在寫程序時(shí), 有些特定的代碼,不論程序是否發(fā)生異常,都需要執(zhí)行,比如程序中打開的資源 :網(wǎng)絡(luò)連接、數(shù)據(jù)庫連接、IO 流等, 在程序正?;蛘弋惓M顺鰰r(shí),必須要對(duì)資源進(jìn)進(jìn)行回收 。另外,因?yàn)?nbsp;異常會(huì)引發(fā)程序的跳轉(zhuǎn),可能導(dǎo)致有些語句執(zhí)行不到 , finally 就是用來解決這個(gè)問題的。

還有 finally 中的代碼一定會(huì)執(zhí)行的,一般在 finally 中進(jìn)行一些資源清理的掃尾工作

語法格式:
try{
// 可能會(huì)發(fā)生異常的代碼
}catch(異常類型 e){
// 對(duì)捕獲到的異常進(jìn)行處理
}finally{
// 此處的語句無論是否發(fā)生異常,都會(huì)被執(zhí)行到
}
// 如果沒有拋出異常,或者異常被捕獲處理了,這里的代碼也會(huì)執(zhí)行

(補(bǔ)充)異常的處理流程: 如果本方法中沒有合適的處理異常的方式, 就會(huì)沿著調(diào)用棧向上傳遞 ( 方法1--》方法2--》方法3---》main方法----》jvm)

三. 自定義異常類:

Java 中雖然已經(jīng)內(nèi)置了豐富的異常類, 但是并不能完全表示實(shí)際開發(fā)中所遇到的一些異常,此時(shí)就需要維護(hù)符合我們實(shí)際情況的異常結(jié)構(gòu).就需要自定義異常

例如, 我們實(shí)現(xiàn)一個(gè)用戶登陸功能:

根據(jù)業(yè)務(wù)此時(shí)我們?cè)谔幚碛脩裘艽a錯(cuò)誤的時(shí)候可能就需要拋出兩種異常

注意:

1.自定義異常類,然后繼承自Exception 或者 RunTimeException

2. 實(shí)現(xiàn)一個(gè)帶有String類型參數(shù)的構(gòu)造方法,參數(shù)含義:出現(xiàn)異常的原因

業(yè)務(wù)代碼:

class login {
    private String userName;
    private String passWord;

    public  void loginFo(String userName, String passWord)throws UserException,PassWardException{
        if (!this.userName.equals(userName)) {
            throw new UserException("拋出自定義,的用戶名錯(cuò)誤異常");

        }

        if (!this.passWord.equals(passWord)) {
            
            throw new PassWardException("拋出密碼自定義,的用密碼錯(cuò)誤異常");

        }

        System.out.println("登錄成功!");
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

public class TestException {
    public static void main(String[] args) throws UserException {
        login login = new login();
        login.setPassWord("321");
        login.setUserName("haha");
        login.loginFo("haha", "323");

        /*try {
            login.loginFo("haha", "323");

        }catch (UserException e) {
            e.printStackTrace();
        }catch (PassWardException e) {
            e.printStackTrace();
        }finally {

        }*/
    }
}

總結(jié)

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

相關(guān)文章

  • Java中如何控制bean的加載順序

    Java中如何控制bean的加載順序

    springboot遵從約定大于配置的原則,極大程度的解決了配置繁瑣的問題,在此基礎(chǔ)上,又提供了spi機(jī)制,用spring.factories可以完成一個(gè)小組件的自動(dòng)裝配功能,這篇文章主要介紹了如何控制bean的加載順序,需要的朋友可以參考下
    2024-12-12
  • Java?IO流—異常及捕獲異常處理?try…catch…finally

    Java?IO流—異常及捕獲異常處理?try…catch…finally

    這篇文章主要介紹了Java?IO流—異常及捕獲異常處理?try…catch…finally,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Kafka利用Java實(shí)現(xiàn)數(shù)據(jù)的生產(chǎn)和消費(fèi)實(shí)例教程

    Kafka利用Java實(shí)現(xiàn)數(shù)據(jù)的生產(chǎn)和消費(fèi)實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Kafka利用Java實(shí)現(xiàn)數(shù)據(jù)的生產(chǎn)和消費(fèi)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java內(nèi)存模型JMM詳解

    Java內(nèi)存模型JMM詳解

    這篇文章主要介紹了Java內(nèi)存模型JMM詳解,涉及volatile和監(jiān)視器鎖,final字段,內(nèi)存屏障等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    這篇文章主要介紹了使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出,EasyExcel是一個(gè)快速解決大文件內(nèi)存溢出的Excel處理工具,它能讓你在不用考慮性能、內(nèi)存等因素的情況下,快速完成Excel的讀、寫等功能,需要的朋友可以參考下
    2023-10-10
  • java反射獲取包下所有類的操作

    java反射獲取包下所有類的操作

    這篇文章主要介紹了java反射獲取包下所有類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • elasticsearch集群cluster?discovery可配式模塊示例分析

    elasticsearch集群cluster?discovery可配式模塊示例分析

    這篇文章主要為大家介紹了elasticsearch集群cluster?discovery可配式模塊示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)

    java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)

    Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來完成,下面看一個(gè)簡(jiǎn)單的示例就明白了
    2014-01-01
  • Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳解

    Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳

    本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();
    2022-02-02
  • java中拼接字符串的5種方法效率對(duì)比

    java中拼接字符串的5種方法效率對(duì)比

    這篇文章主要給大家介紹了關(guān)于java中拼接字符串的5種方法效率對(duì)比的相關(guān)資料,文中通過示例代碼和圖片介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評(píng)論