Java語言程序設(shè)計(jì)-基礎(chǔ)篇-中文ppt-第十三章_第1頁
Java語言程序設(shè)計(jì)-基礎(chǔ)篇-中文ppt-第十三章_第2頁
Java語言程序設(shè)計(jì)-基礎(chǔ)篇-中文ppt-第十三章_第3頁
Java語言程序設(shè)計(jì)-基礎(chǔ)篇-中文ppt-第十三章_第4頁
Java語言程序設(shè)計(jì)-基礎(chǔ)篇-中文ppt-第十三章_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第13章

異常處理2動因當(dāng)一個(gè)程序運(yùn)行時(shí)出現(xiàn)一個(gè)運(yùn)行時(shí)錯(cuò)誤時(shí),這個(gè)程序就會異常終止

。該如何處理這個(gè)運(yùn)行時(shí)錯(cuò)誤,以使程序可以繼續(xù)運(yùn)行或者平穩(wěn)終止呢?

這就是本章要介紹的主題。

3學(xué)習(xí)目標(biāo)了解異常和異常處理的概貌(第13.2節(jié))。探究使用異常處理的優(yōu)點(diǎn)(第13.3節(jié))。區(qū)別異常的類型:

Error(致命的)和

Exception(非致命的),以及必檢和免檢異常(第13.4節(jié))。在方法頭中聲明異常(第13.5.1節(jié))。在方法中拋出異常(第13.5.2節(jié))。編寫try-catch

塊處理異常(第13.5.3節(jié))。解釋異常是如何傳播的(第13.5.3節(jié))。在try-catch塊中使用finally子句(第13.6節(jié))。只為非預(yù)期錯(cuò)誤使用異常(第13.7節(jié))。在catch

塊中重新拋出異常(第13.8節(jié))。創(chuàng)建鏈?zhǔn)疆惓#ǖ?3.9節(jié))。定義自定制的異常類(第13.10節(jié))。4異常處理概述QuotientRunQuotientWithIfRunQuotientWithExceptionRun顯示運(yùn)行時(shí)錯(cuò)誤使用一條if語句來處理它如果在方法被調(diào)用時(shí)發(fā)生運(yùn)行錯(cuò)誤該怎么辦?5異常處理的優(yōu)勢QuotientWithMethodRun現(xiàn)在,你看到了使用異常處理的優(yōu)點(diǎn)。它能使方法拋出一個(gè)異常給它的調(diào)用者。這個(gè)調(diào)用者可以處理該異常。如果沒有這個(gè)能力,那么被調(diào)用的方法就必須自己處理異常或終止該程序。6處理InputMismatchException異常InputMismatchExceptionDemoRun通過處理異常InputMismatchException,程序?qū)⒖梢岳^續(xù)讀取輸入直到它是正確的為止。7異常類型8系統(tǒng)錯(cuò)誤系統(tǒng)錯(cuò)誤(Systemerrors)

是由Java虛擬機(jī)拋出的,它用Error類表示。Error類描述的是內(nèi)部系統(tǒng)錯(cuò)誤。這樣的錯(cuò)誤很少發(fā)生。如果發(fā)生,除了通知用戶以及盡量穩(wěn)妥地終止程序外,幾乎什么也不能做。9異常異常(Exception)

描述的是由程序和外部環(huán)境所引起的錯(cuò)誤,這些錯(cuò)誤能被程序捕獲和處理。10運(yùn)行時(shí)異常運(yùn)行時(shí)異常(RuntimeException)是程序設(shè)計(jì)錯(cuò)誤所引起的,例如,錯(cuò)誤的類型轉(zhuǎn)換、訪問越界數(shù)組或數(shù)值錯(cuò)誤。11必檢異常和免檢異常RuntimeException、Error以及它們的子類都被稱為免檢異常(unchecked

exceptions)。所有其它異常都被稱為必檢異常(checkedexceptions),意思是編譯器會強(qiáng)制程序員檢查并處理它們。12免檢異常在大多數(shù)情況下,免檢異常都會反映出程序設(shè)計(jì)中不可恢復(fù)的邏輯錯(cuò)誤。例如:如果通過一個(gè)引用變量訪問一個(gè)對象之前并未將一個(gè)對象賦值給它,就會拋出一個(gè)

NullPointerException異常;如果訪問一個(gè)數(shù)組的界限外的元素,就會拋出IndexOutOfBoundsException異常。這些都是程序中必須糾正的邏輯錯(cuò)誤。免檢異常可能在程序的任何一個(gè)地方出現(xiàn)。為避免過多地使用try-catch塊,Java語言不允許編寫代碼捕獲或聲明免檢異常。13免檢異常免檢異常。14聲明、拋出和捕獲異常15聲明異常每個(gè)方法都必須聲明它可能拋出的必檢異常的類型。這被稱為聲明異常(declaringexceptions)。

publicvoidmyMethod()throwsIOExceptionpublicvoidmyMethod()throwsIOException,OtherException16拋出異常當(dāng)程序檢測一個(gè)錯(cuò)誤時(shí),程序可以創(chuàng)建一個(gè)恰當(dāng)?shù)漠惓n愋偷膶?shí)例并拋出它。這就被稱為拋出一個(gè)異常(throwinganexception)。這里有一個(gè)例子:thrownewTheException();TheExceptionex=newTheException();

throwex;17拋出異常舉例

/**Setanewradius*/publicvoidsetRadius(doublenewRadius)

throwsIllegalArgumentException{if(newRadius>=0)radius=newRadius;else

thrownewIllegalArgumentException("Radiuscannotbenegative");}18捕獲異常try{statements;//Statementsthatmaythrowexceptions}catch(Exception1exVar1){handlerforexception1;}catch(Exception2exVar2){handlerforexception2;}...catch(ExceptionNexVar3){handlerforexceptionN;}

19捕獲異常20捕獲或聲明必檢異常Java強(qiáng)迫程序員處理必檢異常。如果方法聲明了一個(gè)必檢異常(即Error或RuntimeException之外的異常),就必須在try-catch塊中調(diào)用它,或者在調(diào)用方法中聲明要拋出異常。例如:假定方法p1調(diào)用方法p2,而p2

可能會拋出一個(gè)必檢異常(例如:IOException),就必須編寫如圖(a)和(b)所示代碼。21舉例:聲明、拋出和捕獲異常目標(biāo):本例改寫第8章中定義的Circle類的setRadius方法來演示如何聲明、拋出和捕獲異常。如果半徑是負(fù)數(shù),那么新的setRadius方法就會拋出一個(gè)異常。TestCircleWithExceptionRunCircleWithException22重新拋出異常try{statements;}catch(TheExceptionex){performoperationsbeforeexits;throwex;}23finally子句try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}24跟蹤程序執(zhí)行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;假設(shè)語句中沒有出現(xiàn)異常25跟蹤程序執(zhí)行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;finally子句總是會被執(zhí)行26跟蹤程序執(zhí)行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;執(zhí)行這個(gè)方法的下一條語句27跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;假設(shè)在statement2中有Exception1類型的異常被拋出28跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;這個(gè)異常被處理29跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;final塊總是會被執(zhí)行30跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;現(xiàn)在執(zhí)行方法后的下一條子句31跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;statement2拋出一個(gè)Exception2類型的異常32跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;處理異常33跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;執(zhí)行final塊34跟蹤程序執(zhí)行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;重新拋出異常并把控制權(quán)交給調(diào)用者35使用異常時(shí)注意事項(xiàng)異常處理將錯(cuò)誤處理代碼從正常的程序設(shè)計(jì)任務(wù)中分離開,這樣,程序會更易閱讀和修改。但是,應(yīng)該注意,由于異常處理需要初始化新的異常對象,需要從調(diào)用棧返回而且還需要沿著方法調(diào)用鏈來傳播異常以便找到它的異常處理器,所以,異常處理通常需要更多的時(shí)間和資源。36何時(shí)拋出異常異常出現(xiàn)在方法中。如果想讓該方法的調(diào)用者處理異常,你應(yīng)該創(chuàng)建一個(gè)異常對象并將其拋出。如果能在發(fā)生異常的方法中處理異常,那么就不需要拋出異常。37何時(shí)使用異常在代碼中,什么時(shí)候應(yīng)該使用try-catch塊呢?當(dāng)必須處理不可預(yù)料的錯(cuò)誤狀況時(shí)應(yīng)該使用它。不要用它來處理簡單的、可預(yù)料的情況。例如,下面的代碼:try{System.out.println(refVar.toString());}catch(NullPointerExceptionex){System.out.println("refVarisnull");}38何時(shí)使用異常最好用以下代碼代替:if(refVar!=null)System.out.println(refVar.toString());elseSystem.out.println("refVarisnull");39定義自定制異常類盡量使用API中的異常類。如果預(yù)定義的類不夠則定義自定制的異常類。通過擴(kuò)展Exception類或其子類定義自定制的異常類。40自定制異常類舉例RunInvalidRadiusException在程序清單13.8中,當(dāng)半徑為負(fù)時(shí),setRadius方法會拋出一個(gè)異常。假設(shè)希望把這個(gè)半徑傳遞給處理者,就必須創(chuàng)建一個(gè)自定制的異常類。CircleWithRadiusExceptionTestCircleWithRadiusException41斷言(Assertion)斷言就是Java程序中的一條語句,它能夠判斷你程序中的某個(gè)假設(shè)。一個(gè)斷言包含一個(gè)布爾表達(dá)式,當(dāng)程序執(zhí)行時(shí),該表達(dá)式必須為真。斷言用于保證程序的正確性和避免邏輯錯(cuò)誤。配套網(wǎng)站42聲明斷言通過使用JDK1.4版本中的Java關(guān)鍵字assert來聲明一個(gè)斷言:assertassertion;

或assertassertion:detailMessage;這里的斷言是一個(gè)boolean表達(dá)式,detailMessage是一個(gè)基本類型或者是一個(gè)對象(Object)。配套網(wǎng)站43執(zhí)行斷言當(dāng)執(zhí)行斷言語句時(shí),Java會計(jì)算這個(gè)斷言。如果它的值為false,那么該語句將拋出一個(gè)AssertionError對象。AssertionError類有一個(gè)無參數(shù)的構(gòu)造函數(shù)和7個(gè)單參數(shù)的重載構(gòu)造函數(shù),參數(shù)的類型可以是int、long、float、double、boolean、char和Object。對第一種沒有詳細(xì)參數(shù)的斷言語句,調(diào)用AssertionError的無參的構(gòu)造函數(shù)。對于第二種有詳細(xì)消息斷言語句,參數(shù)和消息數(shù)據(jù)類型匹配的構(gòu)造函數(shù)被調(diào)用。因?yàn)锳ssertionError是Error類的子類,所以當(dāng)斷言為false時(shí),程序會在控制臺上顯示一條信息并退出。配套網(wǎng)站44執(zhí)行斷言舉例publicclassAssertionDemo{publicstaticvoidmain(String[]args){inti;intsum=0;for(i=0;i<10;i++){sum+=i;}asserti==10;assertsum>10&&sum<5*10:"sumis"+sum;}}配套網(wǎng)站45編譯帶斷言的程序因?yàn)閍ssert是JDK1.4新引入的Java關(guān)鍵字,所以我們必須使用JDK1.4版本的編譯器來編譯程序。此外,你還需要在編譯命令上添加“–source1.4”,如下:javac–source1.4AssertionDemo.java注:如果你使用的是JDK1.5,就不用在命令上使用“–source1.4”這一項(xiàng)。配套網(wǎng)站46運(yùn)行帶斷言的程序默認(rèn)情況下,斷言在運(yùn)行時(shí)是禁用的。為了使用它,使用開關(guān)

–enableassertions或

–ea,如下所示:java–eaAssertionDemo斷言可以在類級別或包級別選擇性的啟用或禁用。禁用開關(guān)是–disableassertions或

–da

溫馨提示

  • 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

提交評論