您好,登錄后才能下訂單哦!
Exception和Error的區(qū)別有哪些,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
Exception和Error都是繼承了Throwable類(lèi),在Java代碼中只有繼承了Throwable類(lèi)的實(shí)例才可以被throw或者被catch。
Exception是程序正常運(yùn)行過(guò)程中可以預(yù)料到的意外情況,應(yīng)該被開(kāi)發(fā)者捕獲并且進(jìn)行相應(yīng)的處理。
Error是指在正常情況下不太可能出現(xiàn)的情況,絕大部分的Error都會(huì)導(dǎo)致程序處于不正常、不可恢復(fù)的狀態(tài)也就是掛了。所以不便也不需被開(kāi)發(fā)者捕獲,因?yàn)檫@個(gè)情況下你捕獲了也無(wú)濟(jì)于事。
Java異常又分可檢查異常和不檢查異常??蓹z查異常就是編譯器要求必須處置的異常,比如IOException等在代碼里必須顯式的進(jìn)行捕獲處理。不檢查異常就是編譯器不要求強(qiáng)制處置的異常,包括運(yùn)行時(shí)異常(RuntimeException和其子類(lèi))和錯(cuò)誤(Error),比如NullPointerException等。
異常處理的注意事項(xiàng)
1、盡量不要捕獲類(lèi)似Exception這樣通用的異常,而應(yīng)該捕獲特定的異常。
軟件工程是一門(mén)協(xié)作的藝術(shù),在日常的開(kāi)發(fā)中我們有義務(wù)使自己的代碼能更直觀、清晰的表達(dá)出我們想要表達(dá)的信息。
但是如果你什么異常都用了Exception,那別的開(kāi)發(fā)同事就不能一眼得知這段代碼實(shí)際想要捕獲的異常,并且這樣的代碼也會(huì)捕獲到可能你希望它拋出而不希望捕獲的異常。
2、不要"吞"了異常
如果我們捕獲了異常,不把異常拋出,或者沒(méi)有寫(xiě)到日志里,那會(huì)出現(xiàn)什么情況?線上除了bug莫名其妙的沒(méi)有任何的信息,你都不知道哪里出錯(cuò)以及出錯(cuò)的原因。
這可能會(huì)讓一個(gè)簡(jiǎn)單的bug變得難以診斷。而且有些同學(xué)比較喜歡用catch之后用e.printStackTrace(),在我們產(chǎn)品中通常不推薦用這種方法,一般情況下這樣是沒(méi)有問(wèn)題的但是這個(gè)方法輸出的是個(gè)標(biāo)準(zhǔn)錯(cuò)誤流。
比如是在分布式系統(tǒng)中,發(fā)生異常但是找不到stacktrace。所以最好是輸入到日志里,我們產(chǎn)品可以自定義一定的格式,將詳細(xì)的信息輸入到日志系統(tǒng)中,適合清晰高效的排查錯(cuò)誤。
3、不要延遲處理異常
比如你有個(gè)方法,參數(shù)是個(gè)name,函數(shù)內(nèi)部調(diào)了別的好幾個(gè)方法,其實(shí)你的name傳的是null值,但是你沒(méi)有在進(jìn)入這個(gè)方法或者這個(gè)方法一開(kāi)始就處理這個(gè)情況,而是在你調(diào)了別的好幾個(gè)方法然后爆出這個(gè)空指針。
這樣的話明明你的出錯(cuò)堆棧信息只需要拋出一點(diǎn)點(diǎn)信息就能定位到這個(gè)錯(cuò)誤所在的地方,進(jìn)過(guò)了好多方法之后可能就是一坨堆棧信息。
4、只在需要try-catch的地方try-catch,try-catch的范圍能小則小
只要必要的代碼段使用try-catch,不要不分青紅皂白try住一坨代碼,因?yàn)閠ry-catch中的代碼會(huì)影響JVM對(duì)代碼的優(yōu)化,例如重排序。
5、不要通過(guò)異常來(lái)控制程序流程
一些可以用if/else的條件語(yǔ)句來(lái)判斷例如null值等,就不要用異常,異??隙ㄊ潜纫恍l件語(yǔ)句低效的。而且每實(shí)例化一個(gè)Exception都會(huì)對(duì)棧進(jìn)行快照,相對(duì)而言這是一個(gè)比較重的操作,如果數(shù)量過(guò)多開(kāi)銷(xiāo)就不能被忽略了。
6、不要在finally代碼塊中處理返回值或者直接return
在finally中return或者處理返回值會(huì)讓發(fā)生很詭異的事情,比如覆蓋了try中的return,或者屏蔽的異常。具體可以去博客什么查查,這里不具體展開(kāi)講了。
關(guān)于Exception和Error的區(qū)別有哪些問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。