新聞中心
小伙伴們對(duì)Java的異常應(yīng)該是不陌生的,不過很多人只是簡(jiǎn)單的應(yīng)用而已,而沒有全面的,整體的去了解Java的異常體系。今天老顧就來跟大家一起學(xué)習(xí)JAVA的異常。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),臺(tái)江企業(yè)網(wǎng)站建設(shè),臺(tái)江品牌網(wǎng)站建設(shè),網(wǎng)站定制,臺(tái)江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,臺(tái)江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
3W原則
哪都有的3W原則,JAVA異常也可以總結(jié)3W:what、where、why
- what對(duì)應(yīng)異常類型:回答了什么被拋出
- where對(duì)應(yīng)異常堆棧跟蹤:回答了在哪拋出
- why對(duì)應(yīng)異常信息:回答了為什么被拋出
異常體系
上圖我們看出Throwable是異常的***類,Error和Exception是他的子類。
Exception又分RuntimeException和非RuntimeException子類。
Error與Exception區(qū)別
我們看一下他們的概念定義:
(1) Error:程序無法處理的系統(tǒng)錯(cuò)誤,編譯器不做檢查。
- Error表示系統(tǒng)致命的錯(cuò)誤,程序沒法處理。一般是與JVM相關(guān)的問題,如系統(tǒng)崩潰,內(nèi)存溢出,方法調(diào)用棧溢出等,如:經(jīng)常遇到的StackOverflowError、OutOfMemoryError。這種類型的錯(cuò)誤,編譯器不做檢查,都是系統(tǒng)運(yùn)行過程中發(fā)生的。
- 這些錯(cuò)誤靠我們程序本身是無法處理與預(yù)防的,遇到了建議直接程序中止、重啟。
(2) Exception:程序可以處理的異常,捕獲后可處理。
- Exception異常是程序能夠捕獲的,也可以做異常處理,我們要盡可能的去處理,使程序繼續(xù)運(yùn)行,而不是中止程序。
- 總結(jié)一下就是Error是程序無法處理的錯(cuò)誤,Exception是可以處理的異常。
RuntimeException與否區(qū)別
上圖中Exception有兩種類型的異常,我們來看一下。
(1) RuntimeException:不可預(yù)知的,程序應(yīng)當(dāng)自行避免
- 何為不可預(yù)知?如:數(shù)組下標(biāo)越界,訪問對(duì)象空指針等,這種異常是我們小伙伴們?cè)诰帉懗绦驎r(shí)要盡量避免。也就是我們程序員是能夠避免的。
- 如針對(duì)空指針異常,我們應(yīng)該在編程的時(shí)候,加上空指針判斷,if(obj == null)如何如何,這樣就避免了空指針異常。
(2) 非RuntimeException:可預(yù)知的,編譯器可檢查的異常
- 可預(yù)知,如:在我們打開一個(gè)文件時(shí),如文件不存在引用的異常。
- 這種異常編譯器會(huì)檢查出來,必須需要處理的。
- 這個(gè)也稱之為Checked Exception異常類型
責(zé)任歸屬
我們從責(zé)任角度看:
- Error屬于JVM需要承擔(dān)的責(zé)任
- RuntimeException是程序應(yīng)該承擔(dān)的責(zé)任
- 非RuntimeException(CheckedException)可檢查異常是JAVA編譯器應(yīng)該承擔(dān)的責(zé)任
上面代碼直觀一點(diǎn):
們看到Error和RuntimeException編譯器是不檢查的,而CheckedExcepton異常編譯器是檢查的,也就是我們程序員是必須要捕獲處理的。那怎么處理呢?
(1) try-catch方式
用try-catch方式捕獲這個(gè)異常,可以在catch代碼段進(jìn)行異常邏輯處理,這個(gè)就按照實(shí)際業(yè)務(wù)而定。如上圖代碼是FileNotFound異常,根據(jù)這個(gè)類型我們就知道是文件句柄不存在,那我們應(yīng)該做哪些處理。如:提示一下用戶該文件不存在
(2) 上拋異常方式
在復(fù)雜的業(yè)務(wù)中,我們的程序員自己寫的模塊,很有可能被其他程序員寫的模塊進(jìn)行引用,為了能夠讓其他程序員知道我們模塊的異常,并要他們要進(jìn)行處理,我們就可以采用上拋異常方式
我們看一下上層調(diào)用的處理
我們看到上拋異常,是需要調(diào)用方進(jìn)行處理的。那處理的方式是什么呢?其實(shí)就是上面講的try-catch或繼續(xù)上拋。
常見的Error和Exception
(1) RuntimeException
- NullPointerException - 空指針引用異常
- ClassCastException - 類型強(qiáng)制轉(zhuǎn)換異常
- IllegalArgumentException - 傳遞非法參數(shù)異常
- IndexOutOfBoundsException - 下標(biāo)越界異常
- NumberFormatException - 數(shù)字格式異常
(2) 非RuntimeException
- ClassNotFoundException - 找不到指定class異常
- IOException - IO操作異常
(3) Error
- NoClassDefFoundError - 找不到class定義的異常
- StackOverflowError - 深遞歸導(dǎo)致棧被耗盡拋出的異常
- OutOfMemoryError - 內(nèi)存溢出異常
總結(jié)
今天老顧介紹了異常的相關(guān)知識(shí),這點(diǎn)在我們系統(tǒng)開發(fā)時(shí)是非常重要的,尤其在我們?cè)O(shè)計(jì)系統(tǒng)時(shí),要定義我們系統(tǒng)自己的異常,這個(gè)需要整體規(guī)劃異常類型、異常Code、異常信息等,能夠起到很好的排查問題,并方便捕獲處理。
新聞標(biāo)題:阿里面試:關(guān)于Java的異常,你能說多少?
URL分享:http://www.dlmjj.cn/article/dpccsie.html


咨詢
建站咨詢
