Java 常見異常種類(一)

1屋彪、什么是異常

結(jié)構(gòu)不佳的代碼不能運(yùn)行,這是Java的基本理念绒尊。

發(fā)現(xiàn)錯(cuò)誤的理想時(shí)機(jī)是在編譯期畜挥。然而,編譯器并不能發(fā)現(xiàn)所有的錯(cuò)誤婴谱,余下的問題就需要在程序運(yùn)行時(shí)解決蟹但。這就需要錯(cuò)誤能通過某種方式,把適當(dāng)?shù)男畔?傳遞給特定的接收者處理谭羔。Java中的異常處理的目的在于通過使用少量的代碼來簡化大型华糖、可靠的程序的生成,通過此方式讓你的應(yīng)用中沒有未處理的錯(cuò)誤瘟裸,而 且它還帶來了一個(gè)明顯的好處:降低錯(cuò)誤處理代碼的復(fù)雜度客叉。

異常,根據(jù)字面理解话告,有意外之意兼搏。把它置于代碼層面來理解,即阻止了當(dāng)前方法或作用域繼續(xù)執(zhí)行沙郭。

在Java中佛呻,異常被當(dāng)做對象來處理,其基類是Throwable病线。

2吓著、Java中的異常類型

Java從Throwable直接派生出Exception和Error鲤嫡。其中Exception是可以拋出的基本類型,在Java類庫绑莺、方法以及運(yùn)行時(shí)故障中都可能拋出Exception型異常暖眼。Exception表示可以恢復(fù)的異常,是編譯器可以捕捉到的紊撕;Error表示編譯時(shí)和系統(tǒng)錯(cuò)誤罢荡,表示系統(tǒng)在運(yùn)行期間出現(xiàn)了嚴(yán)重的錯(cuò)誤,屬于不可恢復(fù)的錯(cuò)誤对扶,由于這屬于JVM層次的嚴(yán)重錯(cuò)誤区赵,因此這種錯(cuò)誤會(huì)導(dǎo)致程序終止執(zhí)行。Exception又分為檢查異常和運(yùn)行時(shí)異常浪南。

異常類的結(jié)構(gòu)層次圖如下:

image

典型的RuntimeException(運(yùn)行時(shí)異常)包括NullPointerException, ClassCastException(類型轉(zhuǎn)換異常)笼才,IndexOutOfBoundsException(越界異常), IllegalArgumentException(非法參數(shù)異常),ArrayStoreException(數(shù)組存儲異常),AruthmeticException(算術(shù)異常),BufferOverflowException(緩沖區(qū)溢出異常)等;

image

非RuntimeException(檢查異常)包括IOException, SQLException,InterruptedException(中斷異常-調(diào)用線程睡眠時(shí)候),NumberFormatException(數(shù)字格式化異常)等络凿。

而按照編譯器檢查方式劃分骡送,異常又可以分為檢查型異常(CheckedException)和非檢查型異常 (UncheckedException)。Error和RuntimeException合起來稱為UncheckedException絮记,之所以這么 稱呼摔踱,是因?yàn)榫幾g器不檢查方法是否處理或者拋出這兩種類型的異常,因此編譯期間出現(xiàn)這種類型的異常也不會(huì)報(bào)錯(cuò)怨愤,默認(rèn)由虛擬機(jī)提供處理方式派敷。除了Error 和RuntimeException這兩種類型的異常外,其它的異常都稱為Checked異常撰洗。

image

3篮愉、Java如何處理異常

3.1 try-catch, try-finally, try-catch-finally

對于checked類型異常,我們要么對它進(jìn)行處理差导,要么在方法頭使用throws拋出试躏。

public static void createFile() throws IOException{
    File file = new File("C:/test.txt");
    if(!file.exists()){
            file.createNewFile();
    }
}
public static void main(String[] args) {
    try {
        createFile();
    } catch (IOException ex) {
        // handle exception here
    }
}

關(guān)于catch需要注意的幾點(diǎn):

1)、參數(shù)的異常類型必須是Throwable類或者其子類设褐。

2)颠蕴、從上往下的catch語句,其參數(shù)類型必須按照從子類到父類順序助析,因?yàn)橐坏┢ヅ涞揭粋€(gè)類型裁替,就會(huì)忽略往后的catch。比如IOException必須放到Exception前面貌笨,否則編譯器會(huì)報(bào)錯(cuò)弱判。

3)、可以有一個(gè)或者多個(gè)catch語句锥惋,甚至如果有finally語句的情況下昌腰,可以沒有catch語句开伏,如try-finally。

想要捕獲多個(gè)異常遭商,可以使用多個(gè)catch語句固灵,JDK7以后提供了另外一種方式:多重捕獲(multi-catch)。

try{
    // other code
} catch (IOException | SQLException ex) {
    throw ex;  
} 

4)劫流、不要忽略異常巫玻。空的catch塊會(huì)使異常達(dá)不到應(yīng)有的目的祠汇,除非諸如關(guān)閉FileInputStream的時(shí)候仍秤,因?yàn)槟氵€沒有改變文件的狀態(tài),因此不必執(zhí)行任何恢復(fù)動(dòng)作可很,并且已經(jīng)從文件中讀取到所需要的信息诗力,因此不用終止正在進(jìn)行的操作。

關(guān)于finally需要注意的幾點(diǎn):

1)我抠、finally中的代碼總是會(huì)被執(zhí)行苇本,除非在執(zhí)行try或者catch語句時(shí)虛擬機(jī)退出(System.exit(1))。

2)菜拓、finally塊可以做一些資源清理工作瓣窄,如關(guān)閉文件、關(guān)閉游標(biāo)等操作纳鼎。

3)康栈、finally塊不是必須的。

另外喷橙,如果在try和finally塊中都執(zhí)行了return語句,最終返回的將是finally中的return值登舞。

3.2 異常鏈

常常想要在捕獲一個(gè)異常后拋出另外一個(gè)異常贰逾,并且希望把原始異常信息保存下來,這就是異常鏈菠秒。在JDK1.4以后疙剑,Throwable子類在構(gòu)造器 中可以接受一個(gè)cause對象作為參數(shù),表示原始異常践叠,通過這樣把原始異常傳遞給新的異常言缤,使得即使在當(dāng)前位置創(chuàng)建并拋出了新的異常,也能通過這個(gè)異常鏈 追蹤到異常最初發(fā)生的位置禁灼。

但在Throwable子類中管挟,只有Error, Exception, RuntimeException三類異常類提供了帶cause參數(shù)的構(gòu)造器,其它類型的異常則需要通過initCause()方法弄捕。例如定義了CustomException類僻孝,可以這樣使用:

CustomException cmex = new CustomException();
cmex.initCause(new NullPointerException);
throw cmex;

這樣一來导帝,CustomException繼承自Exception或RuntimeException,就屬于自定義異常了穿铆。

一般來說您单,自定義異常的作用有以下情形:

1)、將檢查型異常轉(zhuǎn)換為非檢查型異常荞雏。

2)虐秦、在產(chǎn)生異常時(shí)封裝上下文信息、定義異常碼凤优、收集環(huán)境對象悦陋,有利于信息的傳遞。

4别洪、異常使用指南

1)叨恨、在知道該如何處理的情況下才捕獲異常。

2)挖垛、自定義異常類型痒钝,用以封裝所有的檢查型異常。

3)痢毒、在程序的邊界進(jìn)行異常捕獲送矩。如服務(wù)端相應(yīng)客戶端的請求,在出口處catch內(nèi)部有可能產(chǎn)生的異常哪替,并統(tǒng)一throw一個(gè)封裝過的異常給客戶端栋荸,免得暴露服務(wù)端敏感信息。

4)凭舶、只針對異常的情況才使用異常晌块。不要在所有的代碼中習(xí)慣性地使用try-catch,因?yàn)檫@會(huì)影響性能帅霜。

5)匆背、拋出與抽象相對的異常。如果方法拋出的異常與它執(zhí)行的任務(wù)沒有明顯的聯(lián)系身冀,這種情形會(huì)使人不知所措钝尸。為了避免這個(gè)問題,更高層的實(shí)現(xiàn)應(yīng)該捕獲 低層的異常搂根,同時(shí)拋出可以按照高層抽象進(jìn)行解釋的異常珍促,這種做法被稱為異常轉(zhuǎn)譯(exception translation),如下:

try{
    // use lower-level abstraction to do our bidding
} catch(LowerLevelException ex){
    throw new HigherLevelException(...);
}

另外一種特殊的異常轉(zhuǎn)譯稱為異常鏈剩愧,上面已作描述猪叙。如果低層的異常對于調(diào)試導(dǎo)致高層異常的問題非常有幫助,使用異常鏈就很合適。高層的異常提供訪問方法(Throwable.getCause)來獲得低層的異常沐悦。

6)成洗、每個(gè)方法拋出的異常要有文檔描述。利用Javadoc的@throws標(biāo)記藏否,記錄拋出每個(gè)異常的條件瓶殃。如果一個(gè)方法可能拋出多個(gè)異常,不要使 用這些異常類的某個(gè)超類副签。如不要聲明一個(gè)方法“throws Exception”或“throws Throwable”遥椿,這將沒有任何指導(dǎo)信息。

歡迎加入學(xué)習(xí)交流群569772982淆储,大家一起學(xué)習(xí)交流冠场。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市本砰,隨后出現(xiàn)的幾起案子碴裙,更是在濱河造成了極大的恐慌,老刑警劉巖点额,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舔株,死亡現(xiàn)場離奇詭異,居然都是意外死亡还棱,警方通過查閱死者的電腦和手機(jī)载慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珍手,“玉大人办铡,你說我怎么就攤上這事×找” “怎么了寡具?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稚补。 經(jīng)常有香客問我童叠,道長,這世上最難降的妖魔是什么孔厉? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮帖努,結(jié)果婚禮上撰豺,老公的妹妹穿的比我還像新娘。我一直安慰自己拼余,他們只是感情好污桦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匙监,像睡著了一般凡橱。 火紅的嫁衣襯著肌膚如雪小作。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天稼钩,我揣著相機(jī)與錄音顾稀,去河邊找鬼。 笑死坝撑,一個(gè)胖子當(dāng)著我的面吹牛静秆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巡李,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼抚笔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侨拦?” 一聲冷哼從身側(cè)響起殊橙,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狱从,沒想到半個(gè)月后膨蛮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矫夯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年鸽疾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训貌。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡制肮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出递沪,到底是詐尸還是另有隱情豺鼻,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布款慨,位于F島的核電站儒飒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏檩奠。R本人自食惡果不足惜桩了,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埠戳。 院中可真熱鬧井誉,春花似錦、人聲如沸整胃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至在岂,卻和暖如春奔则,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔽午。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工易茬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祠丝。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓疾呻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親写半。 傳聞我的和親對象是個(gè)殘疾皇子岸蜗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 通俗編程——白話JAVA異常機(jī)制 - 代碼之道,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語閱讀 3,165評論 0 25
  • Java異常類型 所有異常類型都是Throwable的子類叠蝇,Throwable把異常分成兩個(gè)不同分支的子類Erro...
    予別她閱讀 917評論 0 2
  • 初識異常(Exception) 比如我們在取數(shù)組里面的某個(gè)值得時(shí)候璃岳,經(jīng)常會(huì)出現(xiàn)定義的取值范圍超過了數(shù)組的大小,那么...
    iDaniel閱讀 1,864評論 1 2
  • Java異常 異常指不期而至的各種狀況悔捶,如:文件找不到铃慷、網(wǎng)絡(luò)連接失敗、非法參數(shù)等蜕该。異常是一個(gè)事件犁柜,它發(fā)生在程序運(yùn)行...
    java部落閱讀 3,099評論 1 13
  • 看了歡樂頌不過癮,找同類型的小說未果堂淡,于是打算自己寫寫馋缅,人生如戲,全靠腦補(bǔ)绢淀,文筆差萤悴,輕噴么么噠。皆的。覆履。 御璟閣 Ch...
    陳熹微閱讀 624評論 0 0