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