




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十章
異常處理
教學(xué)目標(biāo)異常處理概述
異常分類
異常的捕獲處理
重新拋出異常
異常對(duì)象的生成
重新拋出異常對(duì)象
定義新的異常類型
10.1異常處理概述異常(Exception):是指程序在運(yùn)行過(guò)程中出現(xiàn)的不正常情況或錯(cuò)誤。如除0溢出、數(shù)組越界、文件找不到等,這些錯(cuò)誤的發(fā)生將阻止程序的正常運(yùn)行。當(dāng)出現(xiàn)異常情況時(shí),一個(gè)Exception對(duì)象就產(chǎn)生了,并交由異常處理程序處理,異常處理程序是使程序得以恢復(fù)正常運(yùn)行的處理過(guò)程。10.1異常處理概述(續(xù))Java的異常處理機(jī)制描述如下:在一個(gè)方法的運(yùn)行過(guò)程中,如果發(fā)生了異常,l
則這個(gè)方法(或者是Java虛擬機(jī))生成一個(gè)代表該異常的對(duì)象(它包含了異常的詳細(xì)信息),并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來(lái)處理這一異常。我們把生成異常對(duì)象并把它提交給運(yùn)行時(shí)系統(tǒng)的過(guò)程稱為拋出(throw)一個(gè)異常。l
運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來(lái)處理這一異常,系統(tǒng)在方法的調(diào)用棧中查找,從產(chǎn)生異常的方法開始進(jìn)行回朔,沿著被調(diào)用的順序往前尋找,直到找到包含相應(yīng)異常處理的方法為止。其過(guò)程如圖10-1所示。這一過(guò)程稱為捕獲(catch)一個(gè)異常。l
如該異常未進(jìn)行成功捕獲,則程序?qū)⒔K止運(yùn)行。10.1異常處理概述(續(xù))圖10-1捕獲異常方法調(diào)用method1method2method3method4產(chǎn)生異常處理異常傳遞異常例10-1一個(gè)未被捕獲的異常:被零除//Exc0.javaclassExc0{ publicstaticvoidmain(Stringargs[]){intd=0;inta=42/d;}}
10.2異常分類Java的異常是一個(gè)對(duì)象,所有的異常都直接或間接地繼承Throwable類。Throwable類的繼承層次結(jié)構(gòu)如下:ThrowableExceptionErrorRuntimeExceptionIOException10.2異常分類(續(xù))Throwable類是所有異常的超類。它有兩個(gè)子類Error和Exception。Error類及其子類由Java虛擬機(jī)生成并拋出,包括動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤等。Java程序不應(yīng)捕獲這些異常。Exception類及其子類(RuntimeException和IOException)代表Java程序中可能發(fā)生的異常,并且應(yīng)用程序可以捕獲這些異常。Java將異常分為兩種類型:編譯時(shí)檢查性異常(checkedexception)非檢查性異常(uncheckedexception,又稱運(yùn)行時(shí)異常).10.2異常分類(續(xù))除了Java類庫(kù)所定義的異常類之外,用戶也可以通過(guò)繼承已有的異常類(一般從Throwable類或Exception類繼承)來(lái)定義自己的異常類,并在程序中使用(利用throw產(chǎn)生,catch捕捉)。10.2異常分類(續(xù))常見的異常有:ArithmeticException:算術(shù)運(yùn)算溢出。如除數(shù)為零ArrayIndexOutOfBandsException:數(shù)組下標(biāo)越界異常。ArrayStoreException:數(shù)組儲(chǔ)存異常。數(shù)組復(fù)制時(shí),若源數(shù)組和目標(biāo)數(shù)組的類型不一致時(shí),導(dǎo)致異常。NullPointerException:空指針異常。NumberFormatException:數(shù)據(jù)格式異常。將字符串(含有非數(shù)字)直接轉(zhuǎn)換成數(shù)值時(shí)產(chǎn)生。OutOfMemoryException:內(nèi)存溢出異常。在創(chuàng)建一個(gè)對(duì)象時(shí),由于申請(qǐng)的內(nèi)存空間過(guò)大,導(dǎo)致系統(tǒng)內(nèi)存不夠。IOException:輸入/輸出中的異常。FileNotFoundException:文件找不到異常。NoClassDefFoundException:沒有找到類定義時(shí)的異常。
10.3異常的捕獲處理異常處理塊的一般形式:try{
//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生的異常,由catch中指定的程序處理;}catch(要處理的異常類型和標(biāo)識(shí)符){
//捕獲(catch)一個(gè)異常并進(jìn)行異常處理;}catch(要處理的異常類型和標(biāo)識(shí)符){
//捕獲(catch)一個(gè)異常并進(jìn)行異常處理;;}…finally{
//最終處理;}10.3異常的捕獲處理(續(xù))1、try語(yǔ)句捕獲異常的第一步就是用try{…}語(yǔ)句指定一段代碼,該段代碼就是一次捕獲并處理異常的范圍。在執(zhí)行過(guò)程中,該段代碼可能會(huì)產(chǎn)生并拋出一個(gè)或多個(gè)異常,因此,它后面的catch語(yǔ)句進(jìn)行捕獲時(shí)也要做相應(yīng)的處理。2、catch語(yǔ)句每個(gè)try語(yǔ)句必須伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于捕獲try代碼塊所產(chǎn)生的異常并做相應(yīng)的處理。catch語(yǔ)句有一個(gè)形式參數(shù),用于指明其所能捕獲的異常類型,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋出的異常對(duì)象傳遞給catch語(yǔ)句。
當(dāng)用多個(gè)catch語(yǔ)句時(shí),需要記?。寒惓W宇惐仨氃谒鼈?nèi)魏胃割愔笆褂?/p>
publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();
}catch(FileNotFoundExceptione){…}catch(IOExceptione){…}}}異常子類必須在它們?nèi)魏胃割愔笆褂?0.3異常的捕獲處理(續(xù))
3、finally語(yǔ)句
無(wú)論try所指定的程序塊中拋出或不拋出異常,也無(wú)論catch語(yǔ)句的異常類型是否與所拋出的異常類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。
通常在finally語(yǔ)句中可以進(jìn)行資源的清除工作,如關(guān)閉打開的文件等。finally在文件處理時(shí)非常有用,例如:try{對(duì)文件進(jìn)行處理的程序;}catch(IOExceptione){//對(duì)文件異常進(jìn)行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}注意:在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^(guò)編譯10.4重新拋出異常異常對(duì)象的生成重新拋出異常對(duì)象10.4.1異常對(duì)象的生成Java中異常對(duì)象生成的方式:(1)
由Java虛擬機(jī)生成;(2)
或由Java類庫(kù)中的某些類生成;(3)
或在程序中生成自己的異常對(duì)象。即異常可以不是出錯(cuò)產(chǎn)生,而是人為地拋出。不論那種方式,生成異常對(duì)象都是通過(guò)throw語(yǔ)句實(shí)現(xiàn)的例如:thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:拋出的異常必須是Throwable或其子類的實(shí)例。10.4.1異常對(duì)象的生成(續(xù))例10-3拋出三個(gè)異常類型的對(duì)象并捕獲處理程序拋出了ArithmeticException,ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException三個(gè)異常類型的對(duì)象,并通過(guò)catch語(yǔ)句對(duì)三種異常對(duì)象進(jìn)行了捕獲處理。
classJavaThrow{publicstaticvoidmain(Stringargs[]){try{thrownewArithmeticException();}catch(ArithmeticExceptionae){System.out.println(ae);}try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println(ai);}try{thrownewStringIndexOutOfBoundsException();}catch(StringIndexOutOfBoundsExceptionsi){System.out.println(si);}}}10.4.2重新拋出異常對(duì)象throws重新拋出異常對(duì)象首先必須先生成異常。如果在一個(gè)方法中生成了異常,但是該方法并不處理它自己產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,由調(diào)用它的方法或方法棧來(lái)處理這些異常,這叫重新拋出異常。方法調(diào)用method1method2method3method4產(chǎn)生異常處理異常傳遞異常10.4.2重新拋出異常對(duì)象(續(xù))重新拋出異常對(duì)象的方法是在產(chǎn)生異常的方法名后面加上要拋出(throws)的異常列表:
returnTypemethodName([paramlist])throwsexceptionList例如:類FileInputStream中的read()方法是這樣定義的:publicintread()throwsIOException{…}
10.4.2重新拋出異常對(duì)象(續(xù))例10-4重新拋出異常對(duì)象程序執(zhí)行時(shí),要求用戶從鍵盤輸入一個(gè)字符號(hào)。當(dāng)輸入‘0’時(shí),程序執(zhí)行結(jié)果如左圖所示;當(dāng)輸入非‘0’字符時(shí),程序執(zhí)行結(jié)果如右圖所示。importjava.io.*;classJavaThrows{publicintcompute(intx)throwsArithmeticException{intz=10/x;//可能拋出異常類型ArithmeticException的對(duì)象returnz;}publicvoidmethod1(){intx;try{x=System.in.read();//可能拋出異常類型IOException的對(duì)象;x=x-48;x=compute(x);//拋出異常類型ArithmeticException的對(duì)象
System.out.println(x);}catch(IOExceptionioe){//捕獲異常類型IOException的對(duì)象;System.out.println("readerror");}catch(ArithmeticExceptione){//捕獲異常類型ArithmeticException的對(duì)象System.out.println("devidedby0");}}publicstaticvoidmain(Stringargs[]){ JavaThrowst1=newJavaThrows();t1.method1();}}10.5定義新的異常類型自定義異常類必須繼承自Throwable或Exception類,建議用Exception類。一般不把自定義異常作為Error的子類,因?yàn)镋rror通常被用來(lái)表示系統(tǒng)內(nèi)部的嚴(yán)重故障。當(dāng)自定義異常是從RuntimeException及其子類繼承而來(lái)時(shí),該自定義異常是運(yùn)行時(shí)異常,程序中可以不捕獲和處理它。當(dāng)自定義異常是從Throwable、Exception及其子類繼承而來(lái)時(shí),該自定義異常是編譯時(shí)異常,也即程序中必須捕獲并處理它。
10.5定義新的異常類型(續(xù))自定義異常同樣要用try-catch-finally形式捕獲處理,但異常對(duì)象必須由用戶自己拋出(throw)。自定義異常的一般形式:classMyExceptionextendsException{…}10.5定義新的異常類型(續(xù))例10-5計(jì)算兩個(gè)數(shù)之和,當(dāng)任意一個(gè)數(shù)超出范圍(10,20)時(shí),拋出自己的異常。
//聲明一個(gè)新的異常//NewException.javaclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}//throws重新拋出異常NumberRangeExceptionpublicintCalcAnswer(Stringstr1,Stringstr2)
throwsNumberRangeException{intint1,int2;intanswer=-1;try{int1=Integer.parseInt(str1);//可能產(chǎn)生異常對(duì)象NumberFormatExceptioneint2=Integer.parseInt(str2);//可能產(chǎn)生異常對(duì)象NumberFormatExceptioneif((int1<10)||(int1>20)||(int2<10)||(int2>20)){NumberRangeExceptione=newNumberRangeException("Numbersarenotwithinthespecifiedrange.");throwe;//拋出自定義異常對(duì)象NumberRangeExceptione}answer=int1+int2;}catch(NumberFormatExceptione){//捕獲異常對(duì)象NumberRangeExceptioneSystem.out.println(e.toString());}returnanswer;}//在調(diào)用方法getAnswer中捕獲異常publicvoidgetAnswer(){StringanswerStr;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電工聘請(qǐng)合同范本
- 供熱ppp項(xiàng)目合同范本
- 分期出租手機(jī)合同范本
- 共享單車租賃合同范本
- 個(gè)體雇傭司機(jī)合同范本
- 公司買車抵押合同范本
- 沖壓模具采購(gòu)合同范本
- 內(nèi)墻涂料維修合同范本
- 醫(yī)療材料采購(gòu)合同范本
- 保險(xiǎn)服務(wù)合同范本
- 滬教版數(shù)學(xué)四年級(jí)下冊(cè)全冊(cè)教案
- 2025年廣東省廣晟控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025語(yǔ)文新教材三下全冊(cè)8個(gè)單元教材解讀分析匯編
- 美麗的春天課件
- 2025年山東青島自貿(mào)發(fā)展有限公司招聘筆試參考題庫(kù)含答案解析
- 會(huì)計(jì)法律法規(guī)答題答案
- 中國(guó)國(guó)際大學(xué)生創(chuàng)新大賽與“挑戰(zhàn)杯”大學(xué)生創(chuàng)業(yè)計(jì)劃競(jìng)賽(第十一章)大學(xué)生創(chuàng)新創(chuàng)業(yè)教程
- 新概念英語(yǔ)第一冊(cè)語(yǔ)法練習(xí)
- 《建筑基坑工程監(jiān)測(cè)技術(shù)標(biāo)準(zhǔn)》(50497-2019)
- 數(shù)字經(jīng)濟(jì)學(xué)導(dǎo)論-全套課件
- 部編版五年級(jí)語(yǔ)文下冊(cè)全冊(cè)教材分析
評(píng)論
0/150
提交評(píng)論