chapter10異常處理課件_第1頁(yè)
chapter10異常處理課件_第2頁(yè)
chapter10異常處理課件_第3頁(yè)
chapter10異常處理課件_第4頁(yè)
chapter10異常處理課件_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第十章

異常處理

教學(xué)目標(biāo)異常處理概述

異常分類(lèi)

異常的捕獲處理

重新拋出異常

異常對(duì)象的生成

重新拋出異常對(duì)象

定義新的異常類(lèi)型

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)生異常的方法開(kāi)始進(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異常分類(lèi)Java的異常是一個(gè)對(duì)象,所有的異常都直接或間接地繼承Throwable類(lèi)。Throwable類(lèi)的繼承層次結(jié)構(gòu)如下:ThrowableExceptionErrorRuntimeExceptionIOException10.2異常分類(lèi)(續(xù))Throwable類(lèi)是所有異常的超類(lèi)。它有兩個(gè)子類(lèi)Error和Exception。Error類(lèi)及其子類(lèi)由Java虛擬機(jī)生成并拋出,包括動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤等。Java程序不應(yīng)捕獲這些異常。Exception類(lèi)及其子類(lèi)(RuntimeException和IOException)代表Java程序中可能發(fā)生的異常,并且應(yīng)用程序可以捕獲這些異常。Java將異常分為兩種類(lèi)型:編譯時(shí)檢查性異常(checkedexception)非檢查性異常(uncheckedexception,又稱運(yùn)行時(shí)異常).10.2異常分類(lèi)(續(xù))除了Java類(lèi)庫(kù)所定義的異常類(lèi)之外,用戶也可以通過(guò)繼承已有的異常類(lèi)(一般從Throwable類(lèi)或Exception類(lèi)繼承)來(lái)定義自己的異常類(lèi),并在程序中使用(利用throw產(chǎn)生,catch捕捉)。10.2異常分類(lèi)(續(xù))常見(jiàn)的異常有:ArithmeticException:算術(shù)運(yùn)算溢出。如除數(shù)為零ArrayIndexOutOfBandsException:數(shù)組下標(biāo)越界異常。ArrayStoreException:數(shù)組儲(chǔ)存異常。數(shù)組復(fù)制時(shí),若源數(shù)組和目標(biāo)數(shù)組的類(lèi)型不一致時(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:沒(méi)有找到類(lèi)定義時(shí)的異常。

10.3異常的捕獲處理異常處理塊的一般形式:try{

//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生的異常,由catch中指定的程序處理;}catch(要處理的異常類(lèi)型和標(biāo)識(shí)符){

//捕獲(catch)一個(gè)異常并進(jìn)行異常處理;}catch(要處理的異常類(lèi)型和標(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ù),用于指明其所能捕獲的異常類(lèi)型,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋出的異常對(duì)象傳遞給catch語(yǔ)句。

當(dāng)用多個(gè)catch語(yǔ)句時(shí),需要記住:異常子類(lèi)必須在它們?nèi)魏胃割?lèi)之前使用

publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();

}catch(FileNotFoundExceptione){…}catch(IOExceptione){…}}}異常子類(lèi)必須在它們?nèi)魏胃割?lèi)之前使用10.3異常的捕獲處理(續(xù))

3、finally語(yǔ)句

無(wú)論try所指定的程序塊中拋出或不拋出異常,也無(wú)論catch語(yǔ)句的異常類(lèi)型是否與所拋出的異常類(lèi)型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。

通常在finally語(yǔ)句中可以進(jìn)行資源的清除工作,如關(guān)閉打開(kāi)的文件等。finally在文件處理時(shí)非常有用,例如:try{對(duì)文件進(jìn)行處理的程序;}catch(IOExceptione){//對(duì)文件異常進(jìn)行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}注意:在使用能夠產(chǎn)生異常的方法而沒(méi)有捕獲和處理,程序?qū)⒉荒芡ㄟ^(guò)編譯10.4重新拋出異常異常對(duì)象的生成重新拋出異常對(duì)象10.4.1異常對(duì)象的生成Java中異常對(duì)象生成的方式:(1)

由Java虛擬機(jī)生成;(2)

或由Java類(lèi)庫(kù)中的某些類(lèi)生成;(3)

或在程序中生成自己的異常對(duì)象。即異常可以不是出錯(cuò)產(chǎn)生,而是人為地拋出。不論那種方式,生成異常對(duì)象都是通過(guò)throw語(yǔ)句實(shí)現(xiàn)的例如:thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:拋出的異常必須是Throwable或其子類(lèi)的實(shí)例。10.4.1異常對(duì)象的生成(續(xù))例10-3拋出三個(gè)異常類(lèi)型的對(duì)象并捕獲處理程序拋出了ArithmeticException,ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException三個(gè)異常類(lèi)型的對(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例如:類(lèi)FileInputStream中的read()方法是這樣定義的:publicintread()throwsIOException{…}

10.4.2重新拋出異常對(duì)象(續(xù))例10-4重新拋出異常對(duì)象程序執(zhí)行時(shí),要求用戶從鍵盤(pán)輸入一個(gè)字符號(hào)。當(dāng)輸入‘0’時(shí),程序執(zhí)行結(jié)果如左圖所示;當(dāng)輸入非‘0’字符時(shí),程序執(zhí)行結(jié)果如右圖所示。importjava.io.*;classJavaThrows{publicintcompute(intx)throwsArithmeticException{intz=10/x;//可能拋出異常類(lèi)型ArithmeticException的對(duì)象returnz;}publicvoidmethod1(){intx;try{x=System.in.read();//可能拋出異常類(lèi)型IOException的對(duì)象;x=x-48;x=compute(x);//拋出異常類(lèi)型ArithmeticException的對(duì)象

System.out.println(x);}catch(IOExceptionioe){//捕獲異常類(lèi)型IOException的對(duì)象;System.out.println("readerror");}catch(ArithmeticExceptione){//捕獲異常類(lèi)型ArithmeticException的對(duì)象System.out.println("devidedby0");}}publicstaticvoidmain(Stringargs[]){ JavaThrowst1=newJavaThrows();t1.method1();}}10.5定義新的異常類(lèi)型自定義異常類(lèi)必須繼承自Throwable或Exception類(lèi),建議用Exception類(lèi)。一般不把自定義異常作為Error的子類(lèi),因?yàn)镋rror通常被用來(lái)表示系統(tǒng)內(nèi)部的嚴(yán)重故障。當(dāng)自定義異常是從RuntimeException及其子類(lèi)繼承而來(lái)時(shí),該自定義異常是運(yùn)行時(shí)異常,程序中可以不捕獲和處理它。當(dāng)自定義異常是從Throwable、Exception及其子類(lèi)繼承而來(lái)時(shí),該自定義異常是編譯時(shí)異常,也即程序中必須捕獲并處理它。

10.5定義新的異常類(lèi)型(續(xù))自定義異常同樣要用try-catch-finally形式捕獲處理,但異常對(duì)象必須由用戶自己拋出(throw)。自定義異常的一般形式:classMyExceptionextendsException{…}10.5定義新的異常類(lèi)型(續(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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論