第07章異常處理_第1頁
第07章異常處理_第2頁
第07章異常處理_第3頁
第07章異常處理_第4頁
第07章異常處理_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第七章異常處理授課講師:顏鵬飛本章概述不管程序?qū)懙迷俸茫惓6伎赡軙l(fā)生,而程序也必須能夠處理可能出現(xiàn)的錯(cuò)誤。所以我們要站在異常一定可能會發(fā)生的角度來編寫異常處理程序,應(yīng)對程序有可能發(fā)生的錯(cuò)誤建立一個(gè)良好的異常處理策略。本章目標(biāo)異常的含義及分類異常處理 兩種拋出異常的方式自定義異常常見異常1異常(Exception)異常的含義所謂異常就是程序運(yùn)行時(shí)可能出現(xiàn)一些錯(cuò)誤,比如試圖打開一個(gè)根本不存在的文件等。異常的產(chǎn)生有很多種原因:設(shè)計(jì)者的疏忽、使用者的誤操作、軟硬件錯(cuò)誤等。異常的分類在java語言中,異常是一個(gè)對象,它繼承于Throwable類,所有的Throwable類的子孫類所產(chǎn)生的對象都是例外(異常)。從Throwable直接派生出的異常類有Exception和Error,如圖所示。1.1異常分類(Exception)圖Java異常層次圖ThrowableErrorExceptionRuntimeException1.2異常分類(Exception)在Java的異常體系中,java.lang.Throwable是所有異常的超類,繼承于Object,直接子類為Error和Exception。Error則表示出現(xiàn)了一個(gè)非常嚴(yán)重的異常錯(cuò)誤,并且這個(gè)錯(cuò)誤可能是應(yīng)用程序所不能恢復(fù)的,例如LinkageError,或ThreadDeath等。由Java虛擬機(jī)生成并拋出,Java程序不做處理。Exception是代表了真正實(shí)際意義上的異常對象的根基類。Exception和從它派生而來的所有異常都是應(yīng)用程序能夠捕獲到的,并且可以進(jìn)行異常錯(cuò)誤恢復(fù)處理的異常類型。1.3異常分類(Exception)java.long.Error和java.lang.RuntimeException的子類免于編譯時(shí)的檢查。RuntimeException異常由系統(tǒng)檢測,用戶的Java程序可不做處理,系統(tǒng)將它們交給缺省的異常處理程序。Error和RuntimeException(Exception的子類)為unchecked,即:無需用戶捕獲。除RuntimeException以外的其他Exception都為checked,即:用戶必須捕獲,否則編譯無法通過。1.4Error與Exception的區(qū)別Error通常表示運(yùn)行時(shí)虛擬機(jī)的內(nèi)部錯(cuò)誤,指程序運(yùn)行時(shí)遇到的硬件或操作系統(tǒng)錯(cuò)誤,如:內(nèi)存溢出、虛擬機(jī)錯(cuò)誤等。如:“找不到要裝入類”NoClassDefFoundError“堆棧溢出”StackOverflowError。Exception通常表示在硬件和操作系統(tǒng)正常時(shí),正在虛擬機(jī)中運(yùn)行的程序產(chǎn)生了錯(cuò)誤或者異常的情況,如:“使用null引用”NullPointerException“,文件未找到”FileNotFoundException“。異常處理作用:保證軟件的易用性、可靠性和容錯(cuò)性。1.5示例:異常publicclassTest{publicstaticvoidmain(String[]args){inta=10,b=0;intc=a/b;System.out.println("programend");}}因?yàn)槌龜?shù)為0,上面的程序?qū)a(chǎn)生算術(shù)異常Exceptioninthread“main”java.lang.ArithmeticException:/byzeroatTestException2.main(TestException2.java:4)注意,只有整數(shù)0做除數(shù)才會產(chǎn)生異常,如果是進(jìn)行浮點(diǎn)數(shù)除法時(shí)使用0.0做除數(shù)則沒有異常產(chǎn)生,結(jié)果為Infinity(無窮大)。1.6為什么要使用異常處理傳統(tǒng)的處理方式:事前檢驗(yàn)輸入值。檢查函數(shù)的返回值和錯(cuò)誤代碼。傳統(tǒng)的錯(cuò)誤處理方式容易導(dǎo)致低質(zhì)量的代碼。傳統(tǒng)處理方式的缺點(diǎn):錯(cuò)誤檢測和處理代碼混雜在一起,導(dǎo)致程序代碼難以理解。層層的錯(cuò)誤檢測導(dǎo)致程序效率降低。層層的錯(cuò)誤處理代碼導(dǎo)致程序擴(kuò)大。3異常處理異常處理的定義異常處理是用戶程序以預(yù)定的方式響應(yīng)運(yùn)行錯(cuò)誤和異常的能力。它的基本方式是:當(dāng)一個(gè)方法引發(fā)一個(gè)異常后,可將異常拋出,由該方法的直接或者間接調(diào)用者處理異常。一個(gè)異常處理應(yīng)該完成以下三個(gè)工作:拋出異常,即根據(jù)異常類型產(chǎn)生異常對象;捕獲異常;處理異常。異常處理語句異常處理語句有try、catch、finally、throw和throws。在以下部分將逐一介紹這些語句的作用。3.1異常處理的格式(一)try~catch結(jié)構(gòu)是異常處理的基本結(jié)構(gòu)。這種結(jié)構(gòu)中可能引發(fā)異常的語句封入在try塊中,而處理異常的相應(yīng)語句封入在catch塊中。結(jié)構(gòu)的格式如下:try{

程序執(zhí)行體}catch(異常類型1異常對象1){

異常處理程序體1}catch(異常類型2異常對象2){

異常處理程序體2}3.1.1捕捉并處理異常try/catch塊的功能正常情況下執(zhí)行try{}中的代碼,然后越過所有的catch{}中的代碼,執(zhí)行后面的代碼;如果在執(zhí)行try{}中代碼時(shí)產(chǎn)生了異常,則尋找并執(zhí)行與異常類型相搭配的catch{}中的代碼,執(zhí)行完catch{}中代碼后繼續(xù)執(zhí)行所有catch塊之后的代碼。注意事項(xiàng):catch塊必須與try塊相互搭配,有catch就必須要有try。catch塊必須要緊跟在try塊之后中間不能有其他語句或語句塊。對應(yīng)同一try塊的多個(gè)catch塊必須緊跟著,多個(gè)catch塊之間不能有其他語句或語句塊。3.1.2捕捉并處理異常publicclassTest{publicstaticvoidmain(String[]args){try{Strings="10";inta=Integer.parseInt(s);System.out.println("a="+a);intb=0;System.out.println("b="+b);intc=a/b;System.out.println("a/b="+c);}catch(NumberFormatExceptionnfe){System.out.println("ERROR:"+nfe.getMessage());}catch(ArithmeticExceptionae){System.out.println("ERROR:"+ae);}System.out.println("programends.");}}3.2異常處理的格式(二)try{

程序執(zhí)行體}catch(異常類型1異常對象1){

異常處理程序體1}catch(異常類型2異常對象2){

異常處理程序體2}finally{

異常處理結(jié)束前的執(zhí)行程序體//不論發(fā)生什么異常(或者不發(fā)生任何異常),都要執(zhí)行的部分;}3.2.1finally語句finally語句可以和try語句一起使用,無論是否出現(xiàn)異常,finally語句指明的代碼一定被執(zhí)行。一個(gè)異常處理程序只有一個(gè)finally塊,但并不強(qiáng)制必須要有finally塊。有時(shí),必需處理某些語句(如文件關(guān)閉操作),不管異常是否發(fā)生,都必須執(zhí)行。此時(shí),雖然能夠在try和catch塊放置代碼以結(jié)束文件,但是為了避免重寫代碼,可以把代碼放在finally塊。有時(shí)候我們希望某些語句在發(fā)生異常時(shí)也能執(zhí)行,以釋放外部資源或者關(guān)閉一個(gè)文件,這時(shí)可以用finally語句來實(shí)現(xiàn)。3.2.3finally語句finally通常會配合try、catch使用,在每一處的try或catch將要退出該方法之前,JVM都會保證先去調(diào)用finally的代碼,這里所說的退出不單單是指return語句,try或catch中異常的拋出也會導(dǎo)致相應(yīng)方法的退出(當(dāng)然,前提是不被catch捕獲以及不被finally跳轉(zhuǎn))。在執(zhí)行finally代碼時(shí),如果finally代碼本身沒有退出的語句(return或拋出異常),finally執(zhí)行完畢后還會返回try或catch,由try或catch執(zhí)行退出指令。4兩種拋出異常的方式throw—直接拋出throws—間接拋出異常(聲明異常)4.1throw—直接拋出直接拋出異常是在方法中用關(guān)鍵字throw引發(fā)明確的異常。當(dāng)throw被執(zhí)行時(shí),其后語句將不再被執(zhí)行,執(zhí)行流程將直接尋找catch語句并進(jìn)行匹配throwe。顯然,這種異常不是出錯(cuò)產(chǎn)生,而是人為地拋出。throw拋出異常的格式為:throwThrowableObject;例如:thrownewArithmeticException();4.1.1示例:throw—直接拋出classThrowApp{publicstaticvoidmain(Stringargs[]){ System.out.print(“Now”); try{ System.out.print(“is”); thrownewNullPointerException();//直接拋出一個(gè)異常; //System.out.print(“Thiswillnotexecute!”);//此句不被執(zhí)行

} catch(NullPointerExceptionm){ System.out.print(“the”); } System.out.print(“time.\n”); }}4.1.2示例分析運(yùn)行結(jié)果為:Nowisthetime.說明:在本實(shí)例中,“thrownewNullPointerException();”用于人為拋出異常NullPointerException,catch(NullPointerExceptionm)塊對這類異常進(jìn)行處理。注意:語句System.out.print(“Thiswillnotexecute!”);必須注釋起來,否則編譯時(shí)會出現(xiàn)如下錯(cuò)誤。4.2throws—間接拋出異常說明:如果一個(gè)方法可能導(dǎo)致一個(gè)異常但不處理它,此時(shí)要求在方法聲明中包含throws子句通知潛在調(diào)用者,在發(fā)生異常時(shí)沿著調(diào)用層次向上傳遞,由調(diào)用它的方法來處理這些異常。這類異常成為聲明異常。基本格式為:類型方法名(參量表)throws異常列表{

代碼}4.2.1示例:throwsclassThrowsApp{ privatestaticvoidp()throwsArithmeticException{ //間接拋出異常,自己并未處理,讓方法的直接調(diào)用者來處理

inti; i=4/0;//此句可能引發(fā)異常,可是自己并未處理

} publicstaticvoidmain(Stringargs[]){ try{ p();//方法的直接調(diào)用者俘獲處理異常

} catch(ArithmeticExceptione){ System.out.println(“Error:Divideriszero!\n”); } }}5自定義異常(不用看)通過繼承Exception類或它的子類,實(shí)現(xiàn)自定義異常類。對于自定義異常,必須采用throw語句拋出異常,這種類型的異常不會自行產(chǎn)生??梢酝ㄟ^擴(kuò)展Exception類來創(chuàng)建異常類。用戶定義的異常同樣要用try~catch捕獲,但必須由用戶拋出thrownewMyException。5.1示例:自定義異常//myException.javaclassmyExceptionextendsException{}classUserTrial{intnum1,num2;publicUserTrial(inta,intb) {num1=a;num2=b;}voidshow()throwsmyException{if((num1<0)||(num2>0)){thrownewmyException();}System.out.println("Value1="+num1);System.out.println("Value2="+num2);}}5.2示例:測試自定義異常classmyExceptionThrow{publicstaticvoidmain(Stringargs[]){UserTrialtrial=newUserTrial(-1,1);try{trial.show();}catch(myExceptione){System.out.println("IllegalValues:Caughtin main");}}}5.3示例分析運(yùn)行結(jié)果為:IllegalValues:Caughtinmain說明:由于執(zhí)行創(chuàng)建對象語句UserTrialtrial=newUserTrial(-1,1);num1與num2的值滿足異常觸發(fā)條件。若將此創(chuàng)建對象語句變?yōu)閯?chuàng)建UserTrialtrial=newUserTrial(1,-1);此時(shí)num1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論