【Java】認(rèn)識異常-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)公司主營陽曲網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),陽曲h5小程序制作搭建,陽曲網(wǎng)站營銷推廣歡迎陽曲等地區(qū)企業(yè)咨詢

一、異常的概念

1.1概念

1.2異常的體系

1.3異常的分類

1.3.1編譯時異常

1.3.2運(yùn)行時異常

二、異常的處理

1.LBYL

2.EAFP

三、異常的拋出

四、異常的捕獲

4.1異常聲明throws

4.2 try-catch捕獲并處理

4.3 finally

五、自定義異常類


一、異常的概念 1.1概念

在java中,將程序執(zhí)行過程中發(fā)生的不正常行為稱為異常,比如之前遇到過的算數(shù)異常、數(shù)組越界異常、空指針異?!璲ava中不同類型的異常,都有與其對應(yīng)的類型來進(jìn)行描述。

1.2異常的體系

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

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

2.Error:指的是Java虛擬機(jī)無法解決的嚴(yán)重問題,比如:JVM的內(nèi)部錯誤、資源耗盡等

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

1.3異常的分類

異??赡茉诰幾g時發(fā)生,也可能在程序運(yùn)行時發(fā)生,根據(jù)發(fā)生的時機(jī)不同,可以將異常分為:

1.3.1編譯時異常

在程序編譯期間發(fā)生的異常,稱為編譯時異常,也稱為受檢查異常(Checked Exception),通俗來說就是在寫代碼時編譯器將代碼標(biāo)紅說明是代碼編譯通過不了,即編譯時異常。

1.3.2運(yùn)行時異常

在程序執(zhí)行期間發(fā)生的異常,稱為運(yùn)行時異常,也稱為非受檢查異常(Unchecked Exception)
RunTimeException以及其子類對應(yīng)的異常,都稱為運(yùn)行時異常。在代碼編譯通過后,生成class文件了,再由JVM執(zhí)行過程中出現(xiàn)的錯誤。

二、異常的處理

異常捕捉的基本語法:

try{
	可能出現(xiàn)的異常;
} catch(異常類型  異常對象) {
     對出現(xiàn)的異常進(jìn)行處理;
}
1.LBYL

Look Before You Leap。在操作前做充分的檢查。即:事前防御性

boolean ret = false;
    ret = 用戶登錄();
    if(!ret) {
        處理用戶登錄錯誤;
        return;
    } 
    ret = 用戶借書();
    if(!ret) {
        處理用戶借書錯誤;
        return;
    }
    ret = 退出登錄();
    if (!ret) {
        處理退出登錄錯誤
        return;
    }
    .......

那這種方式有很明顯的缺陷:正常流程和錯誤處理流程代碼混在一起, 代碼整體顯的比較混亂。

2.EAFP

It's Easier to Ask Forgiveness than Permission.?"事后獲取原諒比事前獲取許可更容易". 也就是先操作, 遇到問題再處理. 即:事后認(rèn)錯型

try{
            用戶登錄();
            用戶借書();
            退出登錄();
            ...
        } catch (用戶登錄異常) {
            處理用戶登錄異常;
        } catch (用戶借書異常) {
            處理用戶借書異常;
        } catch (退出登錄異常) {
            處理退出登錄異常;
        }
        ...
    }

優(yōu)勢:正常流程和錯誤流程是分離開的, 程序員更關(guān)注正常流程,代碼更清晰,容易理解代碼
異常處理的核心思想就是 EAFP。

在Java中,異常處理主要的5個關(guān)鍵字:throw、try、catch、final、throws.

三、異常的拋出

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

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

【注意事項】

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

四、異常的捕獲

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

4.1異常聲明throws

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

語法如下:

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

【注意事項】

1. throws必須跟在方法的參數(shù)列表之后
2. 聲明的異常必須是 Exception 或者 Exception 的子類
3. 方法內(nèi)部如果拋出了多個異常,throws之后必須跟多個異常類型,之間用逗號隔開,如果拋出多個異常類型具有父子關(guān)系,直接聲明父類即可。

4. 調(diào)用聲明拋出異常的方法時,調(diào)用者必須對該異常進(jìn)行處理,或者繼續(xù)使用throws拋出

4.2 try-catch捕獲并處理

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

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

當(dāng)異常被捕獲并處理之后,try-catch模塊之后的代碼會被執(zhí)行。而如果捕獲到了異常,由于捕獲時類型不對,就等于沒捕獲到。try-catch模塊之后的代碼不會被執(zhí)行

【注意】

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

2. 如果拋出異常類型與catch時異常類型不匹配,即異常不會被成功捕獲,也就不會被處理,繼續(xù)往外拋,直到JVM收到后中斷程序----異常是按照類型來捕獲的。

3. try中可能會拋出多個不同的異常對象,則必須用多個catch來捕獲----即多種異常,多次捕獲

4. 可以通過一個catch捕獲所有的異常,即多個異常,一次捕獲(不推薦),由于 Exception 類是所有異常類的父類. 因此可以用這個類型表示捕捉所有異常.

4.3 finally

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

finally 執(zhí)行的時機(jī)是在方法返回之前(try 或者 catch 中如果有 return 會在這個 return 之前執(zhí)行 finally). 但是如果
finally 中也存在 return 語句, 那么就會執(zhí)行 finally 中的 return, 從而不會執(zhí)行到 try 中原有的 return.
一般我們不建議在 finally 中寫 return (被編譯器當(dāng)做一個警告)

五、自定義異常類

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

總結(jié)

提示:這里對文章進(jìn)行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。

實現(xiàn)一個用戶登錄功能

public class Test {
    public String name = "bobo";
    public String password = "123456";

    public void login(String name,String password) throws UserNameException {
        if(!this.name.equals(name)) {
            throw new UserNameException("你輸入的用戶名錯誤!");
        }

        if (!this.password.equals(password)) {
            throw new PassWordException("您輸入的密碼錯誤");
        }

    }

    public static void main(String[] args) { //無法將用戶名異常和密碼異常同時檢測出來
        Test test = new Test();
        try {
            test.login("obo","23456");
        } catch (UserNameException e) {
            e.printStackTrace();
        } catch (PassWordException e) {
            e.printStackTrace();
        }
        finally {

        }
    }
}

自定義兩種在登錄時可能出現(xiàn)的異常

密碼錯誤異常:

public class PassWordException extends RuntimeException {
    public PassWordException(String s) {
        super(s);
    }
}

用戶名異常:

public class UserNameException extends RuntimeException {

    public UserNameException(String s) {
        super(s);
    }

}

【注意事項】
1.自定義異常通常會繼承自 Exception 或者 RuntimeException
2.繼承自 Exception 的異常默認(rèn)是受查異常
3.繼承自 RuntimeException 的異常默認(rèn)是非受查異常

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:【Java】認(rèn)識異常-創(chuàng)新互聯(lián)
URL地址:http://muchs.cn/article36/cddosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、ChatGPT、商城網(wǎng)站、網(wǎng)站策劃定制開發(fā)、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化