




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第13章
異常處理2動因當一個程序運行時出現一個運行時錯誤時,這個程序就會異常終止
。該如何處理這個運行時錯誤,以使程序可以繼續運行或者平穩終止呢?
這就是本章要介紹的主題。
3學習目標了解異常和異常處理的概貌(第13.2節)。探究使用異常處理的優點(第13.3節)。區別異常的類型:
Error(致命的)和
Exception(非致命的),以及必檢和免檢異常(第13.4節)。在方法頭中聲明異常(第13.5.1節)。在方法中拋出異常(第13.5.2節)。編寫try-catch
塊處理異常(第13.5.3節)。解釋異常是如何傳播的(第13.5.3節)。在try-catch塊中使用finally子句(第13.6節)。只為非預期錯誤使用異常(第13.7節)。在catch
塊中重新拋出異常(第13.8節)。創建鏈式異常(第13.9節)。定義自定制的異常類(第13.10節)。4異常處理概述QuotientRunQuotientWithIfRunQuotientWithExceptionRun顯示運行時錯誤使用一條if語句來處理它如果在方法被調用時發生運行錯誤該怎么辦?5異常處理的優勢QuotientWithMethodRun現在,你看到了使用異常處理的優點。它能使方法拋出一個異常給它的調用者。這個調用者可以處理該異常。如果沒有這個能力,那么被調用的方法就必須自己處理異?;蚪K止該程序。6處理InputMismatchException異常InputMismatchExceptionDemoRun通過處理異常InputMismatchException,程序將可以繼續讀取輸入直到它是正確的為止。7異常類型8系統錯誤系統錯誤(Systemerrors)
是由Java虛擬機拋出的,它用Error類表示。Error類描述的是內部系統錯誤。這樣的錯誤很少發生。如果發生,除了通知用戶以及盡量穩妥地終止程序外,幾乎什么也不能做。9異常異常(Exception)
描述的是由程序和外部環境所引起的錯誤,這些錯誤能被程序捕獲和處理。10運行時異常運行時異常(RuntimeException)是程序設計錯誤所引起的,例如,錯誤的類型轉換、訪問越界數組或數值錯誤。11必檢異常和免檢異常RuntimeException、Error以及它們的子類都被稱為免檢異常(unchecked
exceptions)。所有其它異常都被稱為必檢異常(checkedexceptions),意思是編譯器會強制程序員檢查并處理它們。12免檢異常在大多數情況下,免檢異常都會反映出程序設計中不可恢復的邏輯錯誤。例如:如果通過一個引用變量訪問一個對象之前并未將一個對象賦值給它,就會拋出一個
NullPointerException異常;如果訪問一個數組的界限外的元素,就會拋出IndexOutOfBoundsException異常。這些都是程序中必須糾正的邏輯錯誤。免檢異??赡茉诔绦虻娜魏我粋€地方出現。為避免過多地使用try-catch塊,Java語言不允許編寫代碼捕獲或聲明免檢異常。13免檢異常免檢異常。14聲明、拋出和捕獲異常15聲明異常每個方法都必須聲明它可能拋出的必檢異常的類型。這被稱為聲明異常(declaringexceptions)。
publicvoidmyMethod()throwsIOExceptionpublicvoidmyMethod()throwsIOException,OtherException16拋出異常當程序檢測一個錯誤時,程序可以創建一個恰當的異常類型的實例并拋出它。這就被稱為拋出一個異常(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塊中調用它,或者在調用方法中聲明要拋出異常。例如:假定方法p1調用方法p2,而p2
可能會拋出一個必檢異常(例如:IOException),就必須編寫如圖(a)和(b)所示代碼。21舉例:聲明、拋出和捕獲異常目標:本例改寫第8章中定義的Circle類的setRadius方法來演示如何聲明、拋出和捕獲異常。如果半徑是負數,那么新的setRadius方法就會拋出一個異常。TestCircleWithExceptionRunCircleWithException22重新拋出異常try{statements;}catch(TheExceptionex){performoperationsbeforeexits;throwex;}23finally子句try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}24跟蹤程序執行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;假設語句中沒有出現異常25跟蹤程序執行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;finally子句總是會被執行26跟蹤程序執行動畫try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;執行這個方法的下一條語句27跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;假設在statement2中有Exception1類型的異常被拋出28跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;這個異常被處理29跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;final塊總是會被執行30跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;現在執行方法后的下一條子句31跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;statement2拋出一個Exception2類型的異常32跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;處理異常33跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;執行final塊34跟蹤程序執行動畫try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;重新拋出異常并把控制權交給調用者35使用異常時注意事項異常處理將錯誤處理代碼從正常的程序設計任務中分離開,這樣,程序會更易閱讀和修改。但是,應該注意,由于異常處理需要初始化新的異常對象,需要從調用棧返回而且還需要沿著方法調用鏈來傳播異常以便找到它的異常處理器,所以,異常處理通常需要更多的時間和資源。36何時拋出異常異常出現在方法中。如果想讓該方法的調用者處理異常,你應該創建一個異常對象并將其拋出。如果能在發生異常的方法中處理異常,那么就不需要拋出異常。37何時使用異常在代碼中,什么時候應該使用try-catch塊呢?當必須處理不可預料的錯誤狀況時應該使用它。不要用它來處理簡單的、可預料的情況。例如,下面的代碼: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中的異常類。如果預定義的類不夠則定義自定制的異常類。通過擴展Exception類或其子類定義自定制的異常類。40自定制異常類舉例RunInvalidRadiusException在程序清單13.8中,當半徑為負時,setRadius方法會拋出一個異常。假設希望把這個半徑傳遞給處理者,就必須創建一個自定制的異常類。CircleWithRadiusExceptionTestCircleWithRadiusException41斷言(Assertion)斷言就是Java程序中的一條語句,它能夠判斷你程序中的某個假設。一個斷言包含一個布爾表達式,當程序執行時,該表達式必須為真。斷言用于保證程序的正確性和避免邏輯錯誤。配套網站42聲明斷言通過使用JDK1.4版本中的Java關鍵字assert來聲明一個斷言:assertassertion;
或assertassertion:detailMessage;這里的斷言是一個boolean表達式,detailMessage是一個基本類型或者是一個對象(Object)。配套網站43執行斷言當執行斷言語句時,Java會計算這個斷言。如果它的值為false,那么該語句將拋出一個AssertionError對象。AssertionError類有一個無參數的構造函數和7個單參數的重載構造函數,參數的類型可以是int、long、float、double、boolean、char和Object。對第一種沒有詳細參數的斷言語句,調用AssertionError的無參的構造函數。對于第二種有詳細消息斷言語句,參數和消息數據類型匹配的構造函數被調用。因為AssertionError是Error類的子類,所以當斷言為false時,程序會在控制臺上顯示一條信息并退出。配套網站44執行斷言舉例publicclassAssertionDemo{publicstaticvoidmain(String[]args){inti;intsum=0;for(i=0;i<10;i++){sum+=i;}asserti==10;assertsum>10&&sum<5*10:"sumis"+sum;}}配套網站45編譯帶斷言的程序因為assert是JDK1.4新引入的Java關鍵字,所以我們必須使用JDK1.4版本的編譯器來編譯程序。此外,你還需要在編譯命令上添加“–source1.4”,如下:javac–source1.4AssertionDemo.java注:如果你使用的是JDK1.5,就不用在命令上使用“–source1.4”這一項。配套網站46運行帶斷言的程序默認情況下,斷言在運行時是禁用的。為了使用它,使用開關
–enableassertions或
–ea,如下所示:java–eaAssertionDemo斷言可以在類級別或包級別選擇性的啟用或禁用。禁用開關是–disableassertions或
–da
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖北省棗陽市白水高中9校聯考高三物理試題含解析
- 2025年江蘇省吳江市青云中學初三下學期五校聯盟考試英語試題含答案
- 沈陽工程學院《英語閱讀(4)》2023-2024學年第二學期期末試卷
- 2025屆重慶市七校聯考高三第四次模擬綜合試卷含解析
- 廣東科學技術職業學院《電子電路基礎實驗(下)》2023-2024學年第二學期期末試卷
- 北京政法職業學院《食品安全進展》2023-2024學年第二學期期末試卷
- 喀什理工職業技術學院《教師職業道德規范與教育政策法規》2023-2024學年第二學期期末試卷
- 廣州現代信息工程職業技術學院《聲樂基礎A》2023-2024學年第一學期期末試卷
- 品牌賣場6S管理
- 幼兒園語言課程
- 軟件詳細設計說明書(例)
- 鋼拱橋專項吊裝方案終稿
- 24式太極拳教案(1~4課)
- 哈薩克斯坦鐵路車站代碼
- 產業經濟學的課后復習答案
- 中國綠色經濟發展之路(PPT-37張)課件
- 客房控制系統——RCU系統培訓PPT通用通用課件
- 履帶式液壓挖掘機挖掘機構設計
- 川崎病診治指南最新ppt課件
- (會議紀要(2011)第29期)河南煤業化工集團有限責任公司會議紀要
- 原子吸收分光光度計檢定規程
評論
0/150
提交評論