異常的處理辦法之一 ?捕獲異常
圖1?異常處理?
上面過(guò)程詳細(xì)解析:
1.try塊:
try語(yǔ)句指定了一段代碼褥紫,該段代碼就是一次捕獲并處理的范圍。在執(zhí)行過(guò)程中坝咐,當(dāng)任意一條語(yǔ)句產(chǎn)生異常時(shí),就會(huì)跳過(guò)該段中后面的代碼。代碼中可能會(huì)產(chǎn)生并拋出一種或幾種類(lèi)型的異常對(duì)象粥帚,它后面的catch語(yǔ)句要分別對(duì)這些異常做相應(yīng)的處理。
一個(gè)try語(yǔ)句必須帶有至少一個(gè)catch語(yǔ)句塊或一個(gè)finally語(yǔ)句塊?限次。?
注意事項(xiàng)
當(dāng)異常處理的代碼執(zhí)行結(jié)束以后芒涡,是不會(huì)回到try語(yǔ)句去執(zhí)行尚未執(zhí)行的代碼。
2.catch:
1)每個(gè)try語(yǔ)句塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句卖漫,用于處理可能產(chǎn)生的不同類(lèi)型的異常對(duì)象费尽。
2)常用方法,這些方法均繼承自Throwable類(lèi)?羊始。
?oString ()方法旱幼,顯示異常的類(lèi)名和產(chǎn)生異常的原因
?getMessage()方法,只顯示產(chǎn)生異常的原因突委,但不顯示類(lèi)名柏卤。
?printStackTrace()方法,用來(lái)跟蹤異常事件發(fā)生時(shí)堆棧的內(nèi)容匀油。
3)Catch捕獲異常時(shí)的捕獲順序:
?如果異常類(lèi)之間有繼承關(guān)系缘缚,在順序安排上需注意。越是頂層的類(lèi)敌蚜,越放在下面桥滨。再不然就直接把多余的catch省略掉。
3.?finally:
1)有些語(yǔ)句钝侠,不管是否發(fā)生了異常该园,都必須要執(zhí)行帅韧,那么就可以把這樣的語(yǔ)句放到finally語(yǔ)句塊中里初。
2)通常在finally中關(guān)閉程序塊已打開(kāi)的資源,比如:文件流、釋放數(shù)據(jù)庫(kù)連接等刁品。
【示例1】典型代碼(先不要敲@盏!)
package?com.bjsxt.four;
import?java.io.FileNotFoundException;
import?java.io.FileReader;
import?java.io.IOException;
public?class?TestReadFile {
????public?static?void?main(String[] args) {
?????? FileReader reader =?null;
???????try{
?????????? reader =?new?FileReader("d:/a.txt");
???????????char?c = (char)reader.read();
???????????char?c2 = (char)reader.read();
?????????? System.out.println(""+c+c2);
?????? }catch(FileNotFoundException e){
?????????? e.?printStackTrace ();
?????? }catch(IOException e){
?????????? e.printStackTrace ();
?????? }finally{
???????????try{
??????????????if(reader!=null){
????????????????? reader.close();
????????????? }
?????????? }catch?(Exception e) {
????????????? e.?printStackTrace ();
?????????? }
?????? }
??? }
}
異常的處理辦法之二 ?聲明異常:throws子句
當(dāng)Checked Exception產(chǎn)生時(shí)魁淳,不一定立刻處理它蒸走,可以再把異常Throws出去别惦。
在方法中使用try-chatch-finally由這個(gè)方法處理異常掸掸。在一些情況下扰付,當(dāng)前方法并不需要處理發(fā)生的異常荒给,而是向上傳遞給調(diào)用它的方法處理志电。
如果一個(gè)方法中可能產(chǎn)生某種異常蚀乔,但是并不能確定如何處理這種異常,則應(yīng)根據(jù)異常規(guī)范在方法的首部聲明該方法可能拋出的異常氯哮。
如果一個(gè)方法拋出多個(gè)已檢查異常良姆,就必須在方法的首部列出所有的異常韩玩,之間以逗號(hào)隔開(kāi)帘不。
【示例2】典型代碼(先不敲!):
import?java.io.FileNotFoundException;
import?java.io.FileReader;
import?java.io.IOException;
public?class?Test {
????public?static?void?main(String[] args) {
???????try?{?
???????????readFile("joke.txt");
?????? }?catch?(FileNotFoundException e) {
? ? ? ? ? ?System.out.println("所需文件不存在灰殴!");
?????? }?catch?(IOException e) {
?????????? System.out.println("文件讀寫(xiě)錯(cuò)誤碱工!");
?????? }
??? }
????public?static?void?readFile(String ? fileName)?throws?FileNotFoundException,IOException {
?????? FileReader in =?new?FileReader(fileName);
???????int?tem = 0;
???????try?{?
?????????? tem = in.read();
???????????while?(tem != -1) {
????????????? System.out.print((char) tem);???????
????????????? tem = in.read();
?????????? }
?????? }?finally?{???? ?
?????????? in.close();??
?????? }
??? }
}
自定義異常
在程序中,可能會(huì)遇到任何標(biāo)準(zhǔn)異常類(lèi)都沒(méi)有充分的描述清楚的問(wèn)題,這種情況下可以創(chuàng)建自己的異常類(lèi)苏揣。
從Exception類(lèi)或者它的子類(lèi)派生一個(gè)子類(lèi)即可?校翔。
習(xí)慣上蔫敲,定義的類(lèi)應(yīng)該包含2個(gè)構(gòu)造器:一個(gè)是默認(rèn)的構(gòu)造器践图,另一個(gè)是帶有詳細(xì)信息的構(gòu)造器缨叫。
【示例3】自定義異常類(lèi)
class? ? IllegalAgeException??????extends?? Exception {
????public?IllegalAgeException?? () {
??? }
????public?IllegalAgeException?? (String? ? msg) {
???????super(msg);
??? }
}
【示例4】自定義異常類(lèi)的使用
class?Person {
????private?String name;
????private?int?age;
????public?void?setName(String name) {
???????this.name = name;
??? }
????public?void?setAge(int?age) {
???????if?(age < 0)
???????????throw?new?IllegalAgeException?? ("人的年齡不應(yīng)該為負(fù)數(shù)");
???????this.age = age;
??? }
????public?String toString() {
???????return?"name is " + name + " and age ? is " + age;
??? }
}
public?class?MyExceptionTest {
????public?static?void?main(String[] args) {
?????? Person p =?new?Person();
???????try?{
?????????? p.setName("Lincoln");
?????????? p.setAge(-1);
?????? }?catch?(IllegalAgeException??? e) {
?????????? e.printStackTrace();
?????????? System.exit(-1);
?????? }
?????? System.out.println(p);
??? }
}
使用異常機(jī)制的建議
1.?要避免使用異常處理代替錯(cuò)誤處理婉商,這樣會(huì)降低程序的清晰性,并且效率低下渣叛。
2.處理異常不可以代替簡(jiǎn)單測(cè)試---?只在異常情況下使用異常機(jī)制
3.不要進(jìn)行小粒度的異常處理---應(yīng)該將整個(gè)任務(wù)包裝在一個(gè)Try語(yǔ)句塊中
4.?異常往往在高層處理(先了解丈秩!后面做項(xiàng)目會(huì)說(shuō)!)
如何利用百度解決異常問(wèn)題
正常學(xué)習(xí)和開(kāi)發(fā)中淳衙,我們經(jīng)常會(huì)遇到各種異常蘑秽。大家在遇到異常時(shí),需要遵循下面三步來(lái)解決:
1. ?細(xì)心查看異常信息箫攀,確定異常種類(lèi)和相關(guān)JAVA代碼行號(hào)
2. ?拷貝異常信息到百度肠牲,查看相關(guān)帖子,尋找解決思路
3.??前兩步無(wú)法搞定靴跛,再問(wèn)同學(xué)或同事缀雳。
4.??前三步無(wú)法搞定,請(qǐng)示領(lǐng)導(dǎo)梢睛。
很多同學(xué)碰到異常一下就慌了肥印,立刻開(kāi)始請(qǐng)教別人搬救兵,殊不知這樣做有兩大壞處扬绪。
第一竖独、太不尊重別人,把別人當(dāng)苦力挤牛。
第二莹痢、失去提高的機(jī)會(huì),自己解決一個(gè)異常墓赴,就意味這有能力解決一類(lèi)異常竞膳。
解決一個(gè)異常能大大提高自身能力。
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記诫硕。筆者江湖人稱(chēng) Mr. G坦辟,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼章办、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作锉走,從小白逐漸做到工程師滨彻、高級(jí)工程師、架構(gòu)師挪蹭。精通Java平臺(tái)軟件開(kāi)發(fā)亭饵,精通JAVAEE,熟悉各種流行開(kāi)發(fā)框架梁厉。
筆記包含從淺入深的六大部分:
A-Java入門(mén)階段
B-數(shù)據(jù)庫(kù)從入門(mén)到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop?