《疯狂Java讲义》10
1.?Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個關(guān)鍵字。? ??
2.Java的異常分為兩種,Checked異常和Runtime異常,Java認(rèn)為Checked異常是在編譯時可以處理的異常,所以它強(qiáng)制Java處理所有的Checked異常,而Runtime異常無需處理.
3.?使用try...catch來捕獲異常:
????語法結(jié)構(gòu)為如下:
?
4.?如果執(zhí)行try塊中的代碼出現(xiàn)了異常情況,系統(tǒng)會自動生成一個異常對象,該異常對象被提交給Java運(yùn)行時環(huán)境,這個過程稱為拋出異常。當(dāng)Java運(yùn)行時環(huán)境接受到這個異常時,會尋找處理該對象的Catch塊,如果找到合適的catch塊,就把對象交給這個catch快進(jìn)行處理,這個過程稱為捕獲異常,當(dāng)然了,如果沒有找到合適的catch塊,那么程序?qū)⒔K止。
5.?程序在執(zhí)行try中的代碼時,如果遇到異常,就會產(chǎn)生Exception,上面也提到了,會調(diào)用合適的catch來進(jìn)行處理。這里要說明的是,每一個可以接收的異常都有自己相對應(yīng)的catch語句,也就是有唯一性。
6.?Java把所有的非正常情況分為兩種,一種是異常(Exception),一種是錯誤(Error)。Error錯誤一般是指與虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰、虛擬機(jī)錯誤、動態(tài)鏈接失效等。這種錯誤無法恢復(fù)或不可能捕獲,將導(dǎo)致應(yīng)用程序中斷,因此應(yīng)用程序不應(yīng)該試圖使用catch塊來捕獲Error對象。
7. try語句與if語句的區(qū)別:
????try和catch語句后面的花括號不能省略,但是if后面如果只有一行語句,花括號是可以省略的。
8. 看一個捕獲異常的栗子:? ?
寫法就是醬紫的。紅框框出來的是try和catch的用法栗子,紫色的框出來的是之前我們講過的Scanner的用法。
給大家看一下結(jié)果:
示例1:
示例2:
換一種輸入方法:
我們再試試捕獲不同異常:
示例3:
如果把括號內(nèi)的數(shù)據(jù)換成:
結(jié)果為(示例4):
????上面的幾種異常處理較為常見,熟悉最好。
?
9.?捕獲異常時,注意先捕獲小異常,再捕獲大異常。就是說,范圍大些的放在程序的后面,更為具體的放在前面。用上面的例子來說,就是將
????紅框內(nèi)的內(nèi)容往后放,因為這個包含的情況很多,上面的都比較具體,所以先小后大。再例如:運(yùn)行時異常應(yīng)該放在空指針異常的后面。
?
10. Java7提供的多異常捕獲
????在Java7之前,每個catch只能捕獲一種異常,但是Java7之后,一個catch塊可以捕獲多種異常。
先看一下示例吧:
上面和之前的代碼一樣,結(jié)果如下:
這就是多異常捕獲,需要注意的兩點是:
(1)書寫問題:多個異常中間用“|”隔開:
(2)捕獲多種類型的異常時,異常變量有隱式的final修飾,因此程序變量不能對異常變量重新賦值。
舉個栗子:
看一下編譯信息:
但是如果是只捕獲一種異常變量的話,就可以重新賦值:
編譯沒有問題。
?
11. 訪問異常信息
(下面烏拉烏拉一堆字可以都不看,吃栗子)
????如果程序需要在catch塊中訪問異常對象的相關(guān)信息,則可以通過訪問catch塊的后異常形參來獲得。當(dāng)Java運(yùn)行時決定調(diào)用某個catch塊來處理該異常對象時,會將異常對象賦值給catch塊后的異常參數(shù),程序就可以通過該參數(shù)獲得異常的相關(guān)信息。
來~栗子:
?
結(jié)果如下:
????所有的異常對象都包含了如下幾個常用的方法:
????1)getMessage():返回該異常的詳細(xì)描述字符串;
????2)printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯誤輸出。
????3)printStackTrace(PrintStream s):將該異常的跟蹤棧信息輸出到指定輸出流;
????4)getStackTrace():返回該異常的跟蹤棧信息。
?
12. 使用finally回收資源
(下面的字可以只看粗體)
????如果程序在try中打開了物理資源(例如數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接和磁盤文件等),這些物理資源必須顯示回收。之前我們講垃圾回收機(jī)制的時候說過,系統(tǒng)只能自動回收一些內(nèi)存中的對象所占用的內(nèi)存,不能回收物理資源。所以怎么辦?如果在try或者catch中進(jìn)行回收處理,程序可能得不到執(zhí)行,所以我們不能放在這兩個地方。為了解決這個問題,異常處理機(jī)制提供了finally塊,不論是否出現(xiàn)異常,finally都會執(zhí)行。多個catch塊放在try之后,finally塊放在catch塊之后。
來~栗子:
?
結(jié)果如下:
?再來~栗子:
?
在上面的try里稍作改動,如上圖。結(jié)果不變。這說明什么?我們印象中的return還是比較厲害的,一般方法執(zhí)行到return都會結(jié)束,但是這里并沒有結(jié)束,finally還是會繼續(xù)執(zhí)行,這里要注意一下。但是并不是說我們對finally無可奈何了。
又來~栗子:
?
這個語句含義是退出虛擬機(jī),所以程序不會執(zhí)行finally塊,結(jié)果如下:
13.?上面我們說到可以用finally塊對物理資源進(jìn)行回收,但是也可以看到,代碼量會增加很多。Java7后,提供了一種看起來較為簡單的方法,看例子:
但是,說實話,我不喜歡這個寫法,可能以后是得這么用,但是,,,以后再說(傲嬌臉.jpg || 傲嬌臉.gif)
?
14. 使用throws聲明拋出異常
????使用throws聲明拋出異常的思路是:當(dāng)前方法不知道如何處理異常,交給上一級去處理。如果main方法不知道如何處理,也可以使用throws聲明拋出異常,交給虛擬機(jī)處理。虛擬機(jī)處理的方式是打印異常的跟蹤棧信息,并終止程序運(yùn)行(就是我們上面舉過的例子)。
????throws聲明拋出異常的語法格式為:
? ? throws ExceptionClass1,ExceptionClass2...
用throws的話就不用try...catch了。
舉個栗子:
?
這個程序結(jié)果和我們之前用try...catch的結(jié)果是一樣的。
?
END
?
??
?
總結(jié)
以上是生活随笔為你收集整理的《疯狂Java讲义》10的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《疯狂Java讲义》9
- 下一篇: 《疯狂Java讲义》11