版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第13章
異常處理2動因當(dāng)一個程序運行時出現(xiàn)一個運行時錯誤時,這個程序就會異常終止
。該如何處理這個運行時錯誤,以使程序可以繼續(xù)運行或者平穩(wěn)終止呢?
這就是本章要介紹的主題。
3學(xué)習(xí)目標(biāo)了解異常和異常處理的概貌(第13.2節(jié))。探究使用異常處理的優(yōu)點(第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ù)期錯誤使用異常(第13.7節(jié))。在catch
塊中重新拋出異常(第13.8節(jié))。創(chuàng)建鏈?zhǔn)疆惓#ǖ?3.9節(jié))。定義自定制的異常類(第13.10節(jié))。4異常處理概述QuotientRunQuotientWithIfRunQuotientWithExceptionRun顯示運行時錯誤使用一條if語句來處理它如果在方法被調(diào)用時發(fā)生運行錯誤該怎么辦?5異常處理的優(yōu)勢QuotientWithMethodRun現(xiàn)在,你看到了使用異常處理的優(yōu)點。它能使方法拋出一個異常給它的調(diào)用者。這個調(diào)用者可以處理該異常。如果沒有這個能力,那么被調(diào)用的方法就必須自己處理異?;蚪K止該程序。6處理InputMismatchException異常InputMismatchExceptionDemoRun通過處理異常InputMismatchException,程序?qū)⒖梢岳^續(xù)讀取輸入直到它是正確的為止。7異常類型8系統(tǒng)錯誤系統(tǒng)錯誤(Systemerrors)
是由Java虛擬機拋出的,它用Error類表示。Error類描述的是內(nèi)部系統(tǒng)錯誤。這樣的錯誤很少發(fā)生。如果發(fā)生,除了通知用戶以及盡量穩(wěn)妥地終止程序外,幾乎什么也不能做。9異常異常(Exception)
描述的是由程序和外部環(huán)境所引起的錯誤,這些錯誤能被程序捕獲和處理。10運行時異常運行時異常(RuntimeException)是程序設(shè)計錯誤所引起的,例如,錯誤的類型轉(zhuǎn)換、訪問越界數(shù)組或數(shù)值錯誤。11必檢異常和免檢異常RuntimeException、Error以及它們的子類都被稱為免檢異常(unchecked
exceptions)。所有其它異常都被稱為必檢異常(checkedexceptions),意思是編譯器會強制程序員檢查并處理它們。12免檢異常在大多數(shù)情況下,免檢異常都會反映出程序設(shè)計中不可恢復(fù)的邏輯錯誤。例如:如果通過一個引用變量訪問一個對象之前并未將一個對象賦值給它,就會拋出一個
NullPointerException異常;如果訪問一個數(shù)組的界限外的元素,就會拋出IndexOutOfBoundsException異常。這些都是程序中必須糾正的邏輯錯誤。免檢異??赡茉诔绦虻娜魏我粋€地方出現(xiàn)。為避免過多地使用try-catch塊,Java語言不允許編寫代碼捕獲或聲明免檢異常。13免檢異常免檢異常。14聲明、拋出和捕獲異常15聲明異常每個方法都必須聲明它可能拋出的必檢異常的類型。這被稱為聲明異常(declaringexceptions)。
publicvoidmyMethod()throwsIOExceptionpublicvoidmyMethod()throwsIOException,OtherException16拋出異常當(dāng)程序檢測一個錯誤時,程序可以創(chuàng)建一個恰當(dāng)?shù)漠惓n愋偷膶嵗伋鏊?。這就被稱為拋出一個異常(throwinganexception)。這里有一個例子: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強迫程序員處理必檢異常。如果方法聲明了一個必檢異常(即Error或RuntimeException之外的異常),就必須在try-catch塊中調(diào)用它,或者在調(diào)用方法中聲明要拋出異常。例如:假定方法p1調(diào)用方法p2,而p2
可能會拋出一個必檢異常(例如:IOException),就必須編寫如圖(a)和(b)所示代碼。21舉例:聲明、拋出和捕獲異常目標(biāo):本例改寫第8章中定義的Circle類的setRadius方法來演示如何聲明、拋出和捕獲異常。如果半徑是負數(shù),那么新的setRadius方法就會拋出一個異常。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í)行這個方法的下一條語句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;這個異常被處理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拋出一個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è)計任務(wù)中分離開,這樣,程序會更易閱讀和修改。但是,應(yīng)該注意,由于異常處理需要初始化新的異常對象,需要從調(diào)用棧返回而且還需要沿著方法調(diào)用鏈來傳播異常以便找到它的異常處理器,所以,異常處理通常需要更多的時間和資源。36何時拋出異常異常出現(xiàn)在方法中。如果想讓該方法的調(diào)用者處理異常,你應(yīng)該創(chuàng)建一個異常對象并將其拋出。如果能在發(fā)生異常的方法中處理異常,那么就不需要拋出異常。37何時使用異常在代碼中,什么時候應(yīng)該使用try-catch塊呢?當(dāng)必須處理不可預(yù)料的錯誤狀況時應(yīng)該使用它。不要用它來處理簡單的、可預(yù)料的情況。例如,下面的代碼:try{System.out.println(refVar.toString());}catch(NullPointerExceptionex){System.out.println("refVarisnull");}38何時使用異常最好用以下代碼代替:if(refVar!=null)System.out.println(refVar.toString());elseSystem.out.println("refVarisnull");39定義自定制異常類盡量使用API中的異常類。如果預(yù)定義的類不夠則定義自定制的異常類。通過擴展Exception類或其子類定義自定制的異常類。40自定制異常類舉例RunInvalidRadiusException在程序清單13.8中,當(dāng)半徑為負時,setRadius方法會拋出一個異常。假設(shè)希望把這個半徑傳遞給處理者,就必須創(chuàng)建一個自定制的異常類。CircleWithRadiusExceptionTestCircleWithRadiusException41斷言(Assertion)斷言就是Java程序中的一條語句,它能夠判斷你程序中的某個假設(shè)。一個斷言包含一個布爾表達式,當(dāng)程序執(zhí)行時,該表達式必須為真。斷言用于保證程序的正確性和避免邏輯錯誤。配套網(wǎng)站42聲明斷言通過使用JDK1.4版本中的Java關(guān)鍵字assert來聲明一個斷言:assertassertion;
或assertassertion:detailMessage;這里的斷言是一個boolean表達式,detailMessage是一個基本類型或者是一個對象(Object)。配套網(wǎng)站43執(zhí)行斷言當(dāng)執(zhí)行斷言語句時,Java會計算這個斷言。如果它的值為false,那么該語句將拋出一個AssertionError對象。AssertionError類有一個無參數(shù)的構(gòu)造函數(shù)和7個單參數(shù)的重載構(gòu)造函數(shù),參數(shù)的類型可以是int、long、float、double、boolean、char和Object。對第一種沒有詳細參數(shù)的斷言語句,調(diào)用AssertionError的無參的構(gòu)造函數(shù)。對于第二種有詳細消息斷言語句,參數(shù)和消息數(shù)據(jù)類型匹配的構(gòu)造函數(shù)被調(diào)用。因為AssertionError是Error類的子類,所以當(dāng)斷言為false時,程序會在控制臺上顯示一條信息并退出。配套網(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編譯帶斷言的程序因為assert是JDK1.4新引入的Java關(guān)鍵字,所以我們必須使用JDK1.4版本的編譯器來編譯程序。此外,你還需要在編譯命令上添加“–source1.4”,如下:javac–source1.4AssertionDemo.java注:如果你使用的是JDK1.5,就不用在命令上使用“–source1.4”這一項。配套網(wǎng)站46運行帶斷言的程序默認情況下,斷言在運行時是禁用的。為了使用它,使用開關(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度三方勞務(wù)派遣與派遣人員培訓(xùn)合同3篇
- 2024年度供應(yīng)鏈金融質(zhì)押擔(dān)保貸款合同3篇
- 2024年標(biāo)準(zhǔn)設(shè)備維護保養(yǎng)服務(wù)協(xié)議模板一
- 2024年版特許經(jīng)營合同服務(wù)內(nèi)容詳解與標(biāo)的約定
- 2024年嬰幼兒奶粉OEM貼牌生產(chǎn)合作協(xié)議3篇
- 洛陽科技職業(yè)學(xué)院《現(xiàn)代生活化學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度版權(quán)質(zhì)押合同標(biāo)的及質(zhì)押條件和質(zhì)押期限
- 2025鄉(xiāng)鎮(zhèn)醫(yī)療機構(gòu)聘用合同
- 汽車用品貨車司機勞動合同
- 咨詢行業(yè)客服聘用合同
- 河南省鄭州市2023-2024學(xué)年高二上學(xué)期期期末生物試題【含答案解析】
- 經(jīng)方論治冠心病九法
- 《體育校本課程的建設(shè)與開發(fā)》課題研究實施方案
- 抵制不健康讀物“讀書與人生”
- (醫(yī)學(xué)課件)帶狀皰疹PPT演示課件
- 特種設(shè)備使用單位落實使用安全主體責(zé)任監(jiān)督管理規(guī)定(第74號)宣貫
- 人工智能與生命科學(xué)融合
- 小學(xué)生憤怒情緒管理策略
- 醫(yī)務(wù)科管理制度培訓(xùn)的效果評估與持續(xù)改進
- 手術(shù)器械采購?fù)稑?biāo)方案(技術(shù)標(biāo))
- MSOP(測量標(biāo)準(zhǔn)作業(yè)規(guī)范)測量SOP
評論
0/150
提交評論