国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常)

這篇具有很好參考價值的文章主要介紹了詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享


目錄

一.異常的概念

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

三.異常的處理

異常處理思路

LBYL:Look Before You Leap

EAFP: It's Easier to Ask Forgiveness than Permission

異常拋出throw

異常的捕獲

提醒聲明throws

?try-catch捕獲處理

finally的作用

四.自定義異常類


一.異常的概念

有一句話說的很好 ”程序員不是在寫B(tài)UG就是在改BUG” ,在日常開發(fā)中,程序員絞盡腦汁的去寫出完美的代碼,但是在程序運行過程中難免回遇見一些奇奇怪怪的問題。而這些問題與BUG總是很難去控制,用人類的思維去看明明是很完美的一個邏輯處理,但是交給編譯器就產(chǎn)生的結(jié)果總會與我們的預(yù)期大相徑庭,在Java中,我們將程序執(zhí)行過程中發(fā)生的不正常的行為稱為異常,比如什么算數(shù)異常啊,數(shù)組越界異常啊,空指針異常啊這都屬于異常的范圍,我們統(tǒng)稱為異常

        System.out.println(10 / 0);
        // 執(zhí)行結(jié)果Exception in thread "main" java.lang.ArithmeticException
        
        int[] arr1 = {1, 2, 3};
        System.out.println(arr1[100]);
        // 執(zhí)行結(jié)果Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
        
        int[] arr2 = null;
        System.out.println(arr2.length);
        // 執(zhí)行結(jié)果Exception in thread "main" java.lang.NullPointerException

并且我們可以看見在Java中對于不同的異常,都有對應(yīng)的類來描述


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

實際上異常的種類是很多的,為了應(yīng)對不同的異?;蛘咤e誤,Java提供了一個非常龐大的異常體系機(jī)構(gòu)供程序員來更好的維護(hù)代碼的安全性,如下圖所示

詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享

異??赡馨l(fā)生在編譯階段,可能發(fā)生在運行階段,因此我們可以按照異常發(fā)生的時間段將其進(jìn)行分類:

  • 編譯時異常,也叫做受查異常
  • 運行時異常,也叫做非受查異常?

但是諸如將單詞拼寫錯誤導(dǎo)致的問題我們程序出現(xiàn)問題的情況不屬于異常


三.異常的處理

代碼中存在異常并不是什么奇怪的事情,但是在出現(xiàn)異常后,我們需要及時通知程序員去修改,對于異常的處理,我們分為倆種思路

異常處理思路

LBYL:Look Before You Leap

也就是說我們在操作之前就對異常做出充分的檢查,也就是事先防御型,比如我們在設(shè)計一款游戲的時候,我們就需要對其中可能發(fā)生的每一個錯誤做出處理機(jī)制和避免機(jī)制

        boolean ret = false;
        ret = loginGame();
        if (!ret) {
            //處理登陸游戲錯誤;
            return;
        }
        ret = startMatch();
        if (!ret) {
            //處理匹配錯誤;
            return;
        }
        ret = conGame();
        if (!ret) {
            //處理游戲確認(rèn)錯誤;
            return;
        }
        ret = choiceChar();
        if (!ret) {
            //處理選擇英雄錯誤;
            return;
        }
        ret = loading();
        if (!ret) {
            //處理載入游戲錯誤;
            return;
        }

但這樣的處理會有一個缺陷:正常流程和錯誤處理流程代碼混在一起, 代碼整體顯的比較混亂

EAFP: It's Easier to Ask Forgiveness than Permission

這樣的思想主要解決的問題不是如何提前避免異常,而是在異常出現(xiàn)以后如何進(jìn)行合理的應(yīng)對

        try {
            loginGame();
            startMatch();
            conGame();
            choiceChar();
            loading();

        } catch (loginGame異常) {
            //處理登陸游戲錯誤;
        } catch (startMatch異常) {
            //處理匹配錯誤;
        } catch (conGame異常) {
            //處理游戲確認(rèn)錯誤;
        } catch (choiceChar異常) {
            //處理選擇英雄錯誤;
        } catch (loading異常) {
            //處理載入游戲錯誤;
        }

在Java中對于異常處理的核心機(jī)制就是EAFP,Java中常用的有5個異常處理的關(guān)鍵字

  • throw
  • try
  • catch
  • final
  • throws

異常拋出throw

在Java中,可以借助throw關(guān)鍵字,拋出一個指定的異常對象,將錯誤信息告知給調(diào)用者。具體語法如下:

throw?new?XXXException?("異常產(chǎn)生的原因");

示例:?

    public static int getElement(int[] array, int index){
        if(null == array){
            throw new NullPointerException("傳遞的數(shù)組為null");
        }
        if(index < 0 || index >= array.length){
            throw new ArrayIndexOutOfBoundsException("傳遞的數(shù)組下標(biāo)越界");
        }
        return array[index];
    }
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        getElement(array, 3);
    }

?注意:

  1. throw?必須寫在方法體內(nèi)部
  2. 拋出的對象必須是Exception 或者 Exception 的子類對象
  3. 如果拋出的是 RunTimeException 或者 RunTimeException?的子類,則可以不用處理,直接交給JVM來處理
  4. 如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯
  5. 異常一旦拋出,其后的代碼就不會執(zhí)行

異常的捕獲

異常的捕獲就是指我們對異常的處理,通常我們有倆種方式去處理:

  • 異常聲明throws
  • try-catch捕獲處理

提醒聲明throws

處在方法聲明時參數(shù)列表之后,當(dāng)方法中拋出編譯時異常,用戶不想處理該異常,此時就可以借助throws將異常拋給方法的調(diào)用者來處理。也就是說當(dāng)前方法不處理異常提醒方法的調(diào)用者處理異常。

語法格式:

修飾符 返回值類型 方法名?(參數(shù)列表) throws 異常類型1,異常類型2...{

}

public class Config {
    File file;
    /*
    FileNotFoundException : 編譯時異常,表明文件不存在
    此處不處理,也沒有能力處理,應(yīng)該將錯誤信息報告給調(diào)用者,讓調(diào)用者檢查文件名字是否給錯誤了
    */
    public void OpenConfig(String filename) throws FileNotFoundException {
        if (filename.equals("config.ini")) {
            throw new FileNotFoundException("配置文件名字不對");
        }
        // 打開文件
    }
}

注意事項:

  • throws?必須跟在方法參數(shù)列表之后
  • 拋出的問題必須是Exception 或者 Exception 的子類對象
  • 方法內(nèi)部如果拋出了多個異常,throws?之后必須跟多個異常類型,之間用逗號隔開,如果拋出多個異常類型具有父子關(guān)系,直接聲明父類即可
  • 調(diào)用聲明拋出的異常方法時,調(diào)用者必須對異常做出處理,或者繼續(xù)使用throws?拋出

示例:?

class Config {
    File file;
    // FileNotFoundException 繼承自 IOException
    public void OpenConfig(String filename) throws IOException {
        if(filename.endsWith(".ini")){
            throw new IOException("文件不是.ini文件");
        }
        if(filename.equals("config.ini")){
            throw new FileNotFoundException("配置文件名字不對");
        }
        // 打開文件
    }
    public void readConfig(){
    }
    public void openConfig(String s) {
    }
    public static void main(String[] args) throws IOException {
        Config config = new Config();
        config.openConfig("config.ini");
    }
}

?try-catch捕獲處理

剛才我們提到的throws?并沒有對異常做出處理,他只是將異常報給調(diào)用者,讓調(diào)用者去處理,而如果要對異常真正的處理就需要使用try-catch

try-catch的一般使用語法如下,其中catch:可以有一個也可以有多個,根據(jù)具體需求分配,finally可以有也可以沒有,但是如果有的話finally中的代碼就一定會執(zhí)行,并且try中的代碼也可以不出現(xiàn)異常:

try{
    // 將可能出現(xiàn)異常的代碼放在這里
    }catch(要捕獲的異常類型 e){
        // 如果try中的代碼拋出異常了,此處catch捕獲時異常類型與try中拋出的異常類型一致時
        //或者是try中拋出異常的基類時,就會被捕獲到
        //對異常就可以正常處理,處理完成后,跳出try-catch結(jié)構(gòu),繼續(xù)執(zhí)行后序代碼
    }catch(異常類型 e){
        // 對異常進(jìn)行處理
    }finally{
        // 此處代碼一定會被執(zhí)行到
    }
}

示例:

class Config {
    File file;
    public void openConfig(String filename) throws FileNotFoundException{
        if(!filename.equals("config.ini")){
            throw new FileNotFoundException("配置文件名字不對");
        }
        // 打開文件
    }
    public void readConfig(){
    }
    public static void main(String[] args) {
        Config config = new Config();
        try {
            config.openConfig("config.txt");
            System.out.println("文件打開成功");
        } catch (IOException e) {
        // 異常的處理方式
        //System.out.println(e.getMessage()); // 只打印異常信息
        //System.out.println(e); // 打印異常類型:異常信息
            e.printStackTrace(); // 打印信息最全面
        }
        // 一旦異常被捕獲處理了,此處的代碼會執(zhí)行
        System.out.println("異常如果被處理了,這里的代碼也可以執(zhí)行");
    }
}

注意:

  • ?try?塊內(nèi)拋出異常位置之后的代碼將不會被執(zhí)行
  • ?如果拋出異常類型與catch時異常類型不匹配,即異常不會被成功捕獲,也就不會被處理,繼續(xù)往外拋,直到JVM收到后中斷程序----異常是按照類型來捕獲的
  • ?try?中可能會拋出多個不同的異常對象,則必須用多個catch來捕獲----即多種異常,多次捕獲
  • 如果異常之間具有父子關(guān)系,一定是子類異常在前catch,父類異常在后catch,否則語法錯誤

finally的作用

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

關(guān)于異常的處理方式,異常的種類有很多,我們要根據(jù)不同的業(yè)務(wù)場景來決定

  • 對于比較嚴(yán)重的問題(例如和算錢相關(guān)的場景), 應(yīng)該讓程序直接崩潰, 防止造成更嚴(yán)重的后果
  • 對于不太嚴(yán)重的問題(大多數(shù)場景), 可以記錄錯誤日志, 并通過監(jiān)控報警程序及時通知程序猿
  • 對于可能會恢復(fù)的問題(和網(wǎng)絡(luò)相關(guān)的場景), 可以嘗試進(jìn)行重試
  • 在我們當(dāng)前的代碼中采取的是經(jīng)過簡化的第二種方式. 我們記錄的錯誤日志是出現(xiàn)異常的方法調(diào)用信息, 能很快速的讓我們找到出現(xiàn)異常的位置. 以后在實際工作中我們會采取更完備的方式來記錄異常信息

四.自定義異常類

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

  • 繼承自 Exception 的異常默認(rèn)是受查異常
  • 繼承自 RunTimeException 的異常默認(rèn)是非受查異常

具體方式:

  1. 自定義異常類,然后繼承自Exception 或者 RunTimeException
  2. 實現(xiàn)一個帶有String類型參數(shù)的構(gòu)造方法,參數(shù)含義:出現(xiàn)異常的原因

例如我們實現(xiàn)一個用戶登陸功能:?

class UserNameException extends Exception {
    public UserNameException(String message) {
        super(message);
    }
}
class PasswordException extends Exception {
    public PasswordException(String message) {
        super(message);
    }
}
class LogIn {
    private String userName = "admin";
    private String password = "123456";
    public static void loginInfo(String userName, String password)
            throws UserNameException,PasswordException{
        if (!userName.equals(userName)) {
            throw new UserNameException("用戶名錯誤!");
        }
        if (!password.equals(password)) {
            throw new PasswordException("用戶名錯誤!");
        }
        System.out.println("登陸成功");
    }
    public static void main(String[] args) {
        try {
            loginInfo("admin", "123456");
        } catch (UserNameException e) {
            e.printStackTrace();
        } catch (PasswordException e) {
            e.printStackTrace();
        }
    }
}



詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享?本次的分享就到此為止了,希望我的分享能給您帶來幫助,也歡迎大家三連支持,你們的點贊就是博主更新最大的動力!詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享如有不同意見,歡迎評論區(qū)積極討論交流,讓我們一起學(xué)習(xí)進(jìn)步!詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享有相關(guān)問題也可以私信博主,評論區(qū)和私信都會認(rèn)真查看的,我們下次再見詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常),Java_SE,java,開發(fā)語言,經(jīng)驗分享文章來源地址http://www.zghlxwxcb.cn/news/detail-752533.html

到了這里,關(guān)于詳解Java中的異常體系結(jié)構(gòu)(throw,throws,try-catch,finally,自定義異常)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 淺析ARMv8體系結(jié)構(gòu):異常處理機(jī)制

    淺析ARMv8體系結(jié)構(gòu):異常處理機(jī)制

    異常處理指的是處理器在運行過程中發(fā)生了外部事件,導(dǎo)致處理器需要中斷當(dāng)前執(zhí)行流程轉(zhuǎn)而去處理異常事件的一種機(jī)制。在Intel處理器的術(shù)語中,中斷與異常被分開來描述,但在ARMv8體系結(jié)構(gòu)中,異常和中斷統(tǒng)一被稱為異常處理。 在ARMv8體系結(jié)構(gòu)中,廣義上的異??梢苑殖赏?/p>

    2024年02月09日
    瀏覽(101)
  • Java基礎(chǔ)語法(十三):throw和throws

    目錄 前言 一、throw 二、throws 總結(jié) 在 Java 編程中,異常處理是非常重要的一環(huán),它不僅能夠保護(hù)程序運行的穩(wěn)定性,還能夠提高代碼的可讀性和易維護(hù)性。Java 中拋出異常的語句有兩種,分別是 throw 和 throws,本文將詳細(xì)介紹這兩個的使用方法及其區(qū)別。

    2024年02月11日
    瀏覽(19)
  • UG\NX二次開發(fā) 使用throw重新拋出異常

    文章作者:里海 來源網(wǎng)站: https://blog.csdn.net/WangPaiFeiXingYuan ????????在異常處理代碼中,可以使用?throw?來拋出異常。如果希望在捕獲異常后重新拋出該異常,可以使用類似以下的代碼: ????????在?catch?塊中,先對異常進(jìn)行處理,例如記錄日志、修復(fù)問題等。

    2024年02月16日
    瀏覽(36)
  • 【Linux】—— 詳解計算機(jī)體系結(jié)構(gòu)

    【Linux】—— 詳解計算機(jī)體系結(jié)構(gòu)

    前言: 在之前,我們已經(jīng)對Linux環(huán)境開發(fā)的基本工具進(jìn)行了詳細(xì)的學(xué)習(xí)。接下來,我們將要學(xué)習(xí)的第一大塊便是關(guān)于計算機(jī)體系結(jié)構(gòu)的知識?。?目錄 前言 (一)馮諾依曼體系結(jié)構(gòu) 基本介紹 木桶原理 數(shù)據(jù)流動過程 (二)操作系統(tǒng) 1、概念 2、感性理解 總結(jié) 在我寫的《操作系

    2024年02月09日
    瀏覽(24)
  • 計算機(jī)體系結(jié)構(gòu)實驗三——流水線中的相關(guān)

    計算機(jī)體系結(jié)構(gòu)實驗三——流水線中的相關(guān)

    答:在WinDLX中執(zhí)行程序段1,這里要聲明的是文件需要以S文件的形式保存,TXT文件winDLX好像讀不進(jìn)去。 導(dǎo)入之后,程序段順利運行,可以通過statistics查看執(zhí)行周期數(shù),由下圖可知,執(zhí)行周期數(shù)為130個周期。 分析程序中出現(xiàn)的暫停: 程序中出現(xiàn)的第一個暫停是數(shù)據(jù)相關(guān),因為

    2023年04月08日
    瀏覽(21)
  • 1.jvm和java體系結(jié)構(gòu)

    1.jvm和java體系結(jié)構(gòu)

    Java是目前應(yīng)用最為廣泛的軟件開發(fā)平臺之一。隨著Java以及Java社區(qū)的不斷壯大Java 也早已不再是簡簡單單的一門計算機(jī)語言了,它更是一個平臺、一種文化、一個社區(qū)。 ● 作為一個平臺,Java虛擬機(jī)扮演著舉足輕重的作用 ○ Groovy、Scala、JRuby、Kotlin等都是Java平臺的一部分 ●

    2024年02月11日
    瀏覽(64)
  • 【Linux】進(jìn)程概念(馮諾依曼體系結(jié)構(gòu)、操作系統(tǒng)、進(jìn)程)-- 詳解

    【Linux】進(jìn)程概念(馮諾依曼體系結(jié)構(gòu)、操作系統(tǒng)、進(jìn)程)-- 詳解

    1、概念 (1)什么是馮諾伊曼體系結(jié)構(gòu)? 數(shù)學(xué)家馮·諾伊曼于 1946 年提出存儲程序原理,把程序本身當(dāng)作數(shù)據(jù)來對待,程序和該程序處理的數(shù)據(jù)用同樣的方式儲存。 馮·諾伊曼理論的要點是:計算機(jī)的數(shù)制采用二進(jìn)制邏輯;計算機(jī)應(yīng)該按照程序順序執(zhí)行。人們把馮·諾伊曼的

    2024年02月22日
    瀏覽(21)
  • 【從零開始學(xué)習(xí)JAVA | 第二十三篇】集合體系結(jié)構(gòu)

    【從零開始學(xué)習(xí)JAVA | 第二十三篇】集合體系結(jié)構(gòu)

    目錄 前言: 單列集合:? ? ? set與list的區(qū)別: 雙列集合: map的特點: 總結(jié): ? ? ? ? ? ? ? ? ? JAVA中為我們提供了很多集合,這些集合都有自己很獨特的特點,因此我們要學(xué)習(xí)所有的集合,但是在學(xué)習(xí)所有的集合之前,我們還是先為大家介紹一下JAVA的集合體系結(jié)構(gòu),這

    2024年02月16日
    瀏覽(17)
  • 【從零開始學(xué)JVM】第一章_JVM和java體系結(jié)構(gòu)

    【從零開始學(xué)JVM】第一章_JVM和java體系結(jié)構(gòu)

    Java是一門跨平臺的語言 Java 語言的特點包括: 跨平臺性 :Java 程序可以在不同操作系統(tǒng)上運行,只需安裝對應(yīng)平臺的 Java 虛擬機(jī)(JVM)即可。 面向?qū)ο?:Java 是一種純粹的面向?qū)ο缶幊陶Z言,支持封裝、繼承、多態(tài)等面向?qū)ο筇匦浴?健壯性 :Java 在設(shè)計時考慮了許多安全檢

    2024年02月20日
    瀏覽(22)
  • 報錯throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang“

    報錯throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang“

    有時候項目在前端瀏覽某些頁面時,會突然報如下錯誤: 與此同時,后端也會跟著報錯: ?問題表現(xiàn)出來的現(xiàn)象就是非法反射訪問警告,之前系統(tǒng)運行都沒問題,怎么突然就報這種錯誤哪,會把人搞得措手不及、不知如何處理。?其實這里有一個非常重要的線索: throws java

    2024年02月07日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包