版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
異常處理異常異常的概念異常的分類捕獲異常聲明異常拋出異常創(chuàng)造自己的異??偨Y(jié)異常處理
異常的概念什么是異常?
異常實際上是程序中錯誤導(dǎo)致中斷了正常的指令流的一種事件.沒有處理錯誤的程序:
read-file{openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}異常處理異常的概念以常規(guī)方法處理錯誤
openFiles;if(the){determinethelenthofthefile;if(gotThe){allocatethatmuchmemory;if(gotEnoughMemory){readthememory;if(readFailed)errorCode=-1;elseerrorCode=1;}elseerrorCode=-3;}elseerrorCode=-5;}elseerrorCode=-5;異常處理
異常的概念觀察前面的程序你會發(fā)現(xiàn)大部分精力花在出錯處理上了.只把能夠想到的錯誤考慮到,對以外的情況無法處理程序可讀性差出錯返回信息量太少異常處理
異常的概念用異常的形式處理錯誤read-File;{try{
openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}catch(){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(){dosomething;}catch(Exception){dosomething;}//其它未考慮到的錯誤
}異常處理異常的概念和傳統(tǒng)的方法比較異常的優(yōu)點:1.把錯誤代碼從常規(guī)代碼中分離出來2.把錯誤傳播給調(diào)用堆棧3.按錯誤類型和錯誤差別分組4.系統(tǒng)提供了對于一些無法預(yù)測的錯誤的捕獲和處理5.克服了傳統(tǒng)方法的錯誤信息有限的問題method1method2method3method4探測拋出例外傳遞捕獲處理例外調(diào)用異常處理什么情況下使用例外機制?當(dāng)方法因為自身無法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無法建立……處理在方法、類庫、類中拋出的例外如產(chǎn)生IOException在大的項目中采用統(tǒng)一的方式處理例外時如編寫一個文字處理器例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應(yīng)該用例外機制來處理例外處理用于使系統(tǒng)從故障中恢復(fù)提示信息/不產(chǎn)生無效的結(jié)果/釋放資源異常的概念異常處理不同的例外處理策略關(guān)鍵性應(yīng)用(處理所有例外)實驗軟件(可以忽略許多例外)處理例外時的注意事項終止程序會導(dǎo)致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯誤不要使用例外機制例外機制的處理比正常處理效率低異常的概念異常處理
異常的概念.classExcepTest{publicvoidmain(Stringargs[]){intb=0;inta;try{a=5/b;}catch(ArithmeticExceptione){System.out.println(“dividedby0”);}}}try{URLurl=newURL(”,”hit.gif”);}catch(MalformedURLExceptione){badURL=true;repaint();}異常處理異常的分類異常是一個對象,它繼承自Throwable類,所有的Throwable類的子孫類所產(chǎn)生的對象都是例外.Error:由Java虛擬機生成并拋出,Java程序不做處理.RuntimeException(被0除等系統(tǒng)錯誤,數(shù)組下標(biāo)超范圍):由系統(tǒng)檢測,用戶的Java程序可不做處理,系統(tǒng)將它們交給缺省的異常處理程序.Exception(程序中的問題,可預(yù)知的):Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常throw:用戶自己產(chǎn)生異常異常處理異常的分類異常處理異常的分類.ThrowableErrorExceptionRuntimeException缺省的異常處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的異常要處理異常處理例外的分類
一個例外是由一個對象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫的每個類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。異常處理
Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。
RuntimeException:Java虛擬機在運行時生成的例外,如被0除等系統(tǒng)錯誤、數(shù)組下標(biāo)超范圍等,其產(chǎn)生比較頻繁,處理麻煩,對程序可讀性和運行效率影響太大。因此由系統(tǒng)檢測,用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當(dāng)然,必要時,用戶可對其處理)。
Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的例外可能會帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。例外的分類異常處理publicstaticvoidmain(String[]args){try{testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());
t.printStackTrace();}}…staticvoidtestThrowable()throwsThrowable{
thrownewThrowable("測試Throwable的用法。");}java.lang.Throwable:測試Throwable的用法。測試Throwable的用法。測試Throwable的用法。java.lang.Throwable:測試Throwable的用法。
attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)異常處理publicstaticvoidmain(String[]args){try{
testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());
t.printStackTrace(System.err);}}…staticvoidtestThrowable()throwsThrowable{
thrownewThrowable();}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)異常處理
例外示例:(1)編譯時例外:在程序中必須對其進行處理,否則編譯器會指出錯誤。
在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時例外:程序中可以不做處理,直接由運行時系統(tǒng)來處理。例外的分類異常處理捕獲異常捕獲并處理異常try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生
//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標(biāo)識符){//處理異常;}catch(要處理的異常種類和標(biāo)識符){//處理異常;}異常處理捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個例外,因此,它后面的catch語句進行捕獲時也要做相應(yīng)的處理。
如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。異常處理捕獲例外catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應(yīng)的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得例外類型,運行時系統(tǒng)通過參數(shù)值把被拋棄的例外對象傳遞給catch語句。程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個catch語句處理多個例外類型,這時它的例外類型應(yīng)該是這多個例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。異常處理catch(Exceptione)
捕獲所有Exceptioncatch(Throwablet)
捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒有相應(yīng)的例外處理,則例外被交給上一層try代碼段進行處理例外處理的查找依據(jù)類型匹配原則順序進行第一個匹配的例外處理被執(zhí)行,當(dāng)例外處理執(zhí)行完畢,程序接著最后一個catch代碼段后的語句執(zhí)行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應(yīng)的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復(fù)到事件處理狀態(tài)捕獲例外
——catch語句異常處理捕獲例外
——catch語句盡量避免用一般類型作為catch中指定要捕獲的類型。一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,在例外處理中無法訪問try代碼段中聲明的變量因為此時try代碼段已經(jīng)退出了,例外處理所需要的任何信息一般都應(yīng)該通過例外對象來傳遞在使用方法時盡量直接處理該方法可能產(chǎn)生的例外這樣你的程序就會更健壯在使用庫方法之前,應(yīng)該先仔細(xì)閱讀說明文檔那里會介紹方法可能產(chǎn)生的例外以及例外產(chǎn)生的條件在使用各種例外類之前也應(yīng)該先仔細(xì)閱讀說明文檔那里會介紹例外的具體含義及例外產(chǎn)生的條件異常處理在catch代碼段中產(chǎn)生的例外不是由相同try的后續(xù)catch代碼段處理,而是由包含整個try-catch結(jié)構(gòu)的上層try代碼段檢測并處理可以把catch到的例外對象再次拋出,使上層try-catch結(jié)構(gòu)繼續(xù)處理該例外事件;也可以把例外對象轉(zhuǎn)換為其它例外對象…catch(Exceptione){throwe;}try-catch機制不該被用于流程控制,例外情形應(yīng)該是很稀少的,而不是經(jīng)常性的在catch代碼段中的return語句用于退出方法,而不是返回到例外拋出點(throwpoint)捕獲例外
——catch語句異常處理
捕獲異常常見的異常ArithmeticException//算術(shù)異常比如被零除ArrayIndexOutOfBoundsException//數(shù)組下標(biāo)越界ArrayStoreException//放入數(shù)組的類型不符IOException//I/O異常//找不到文件異常NullPointerException//空指針異常MalformedURLException//url無法解析異常NumberFormatException//字符串轉(zhuǎn)換數(shù)值異常如果在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,將不能通過編譯異常處理
捕獲異常例:編寫Java程序,包含三種異常算術(shù)異常,字符串越界,數(shù)組越界觀察輸出信息:每個異常對象可以直接給出信息異常處理捕獲異常classfirst_exception{ publicstaticvoidmain(Stringargs[]) {charc;inta,b=0;int[]array=newint[7];Strings="Hello";
try{a=1/b;}catch(ArithmeticExceptionae){System.out.println(“Catch“+ae));}try{array[8]=0;}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println((“Catch“+ai);}
try{c=s.charAt(8));}catch(StringIndexOutOfBoundsExceptionse){System.out.println((“Catch“+se);}}}異常處理
捕獲異常一定會執(zhí)行的程序塊---finally異常處理的統(tǒng)一出口try{//常規(guī)的代碼;}catch(){//處理異常}finally{//不論發(fā)生什么異常(或者不發(fā)生任何異常),都要執(zhí)行的部分;}異常處理捕獲例外finally語句捕獲例外的最后一步是通過finally語句為例外處理提供一個統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。
無論try所指定的程序塊中是否拋出例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。(finally語句與switch中的default語句是不同的?。┩ǔT趂inally語句中可以進行資源的清除工作,如關(guān)閉打開的文件、刪除臨時文件等。異常處理
聲明異常一個方法不處理它產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,由調(diào)用它的方法來處理這些異常,叫聲明異常.聲明異常的方法在產(chǎn)生異常的方法名后面加上要拋出(throws)的異常的列表voidcompute(intx)throwsArithmeticException{…}returnTypemethodName([parameterlist])throwsexceptionList異常處理
聲明異常例:若因某種原因不想在創(chuàng)建URL的方法中處理異常publicmethod1(){intx;try{x=System.in.read();compute(x);}catch(IOExceptionioe){System.out.println(“readerror”);}catch(ArithmeticExceptione){System.out.println(“devidedby0”);}}publicintcompute(intx)throwsArithmeticExceptione){returnz=100/x;}異常處理聲明異常method1computer異常拋出處理異常處理
聲明異常例:說出程序執(zhí)行結(jié)果publicclassexception1{voidProc(intsel)throwsArithmeticException,ArrayIndexOutOfBoundsException{System.out.println(“InSituation"+sel);if(sel==0){System.out.println("noExceptioncaught");return;}elseif(sel==1){intiArray[]=newint[5];iArray[10]=3;}}異常處理聲明異常publicstaticvoidmain(Stringargs[]){try{Proc(0);Proc(1);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e);}}
c:>javathrowsExceptionInSituation0noExceptioncaughtInSituation1Catchjava.lang.ArrayIndexOutOfBoundsException:10異常處理
拋出異常拋棄異常:不是出錯產(chǎn)生,而是人為地拋出throwThrowableObject;thrownewArithmeticException();例:編寫程序人為拋出(JavaThrow.prj)ArithmeticException,ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionAmethodExceptionAnothermethodthrowcaught異常處理
拋出異常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);}異常處理任何從Throwable派生的類對象都可以用throw語句拋出,拋出例外用來表明程序遇到的錯誤無法正常執(zhí)行而需要例外處理thrownewMyException(“someinfomation”);例外可以由try代碼段中的語句拋出也可以從被try代碼段中調(diào)用的方法中拋出例外還可能產(chǎn)生于數(shù)組下標(biāo)越界以及Java虛擬機內(nèi)部錯誤等Exception和Error是Throwable的直接派生類Exception,程序應(yīng)該處理的例外Error代表系統(tǒng)嚴(yán)重錯誤,一般程序不處理這類錯誤例外拋出點后的代碼在拋出例外后不再執(zhí)行也可以說例外的拋出終止了代碼段的執(zhí)行拋出例外(throw語句)異常處理
創(chuàng)造自己的異常不是由Java系統(tǒng)監(jiān)測到的異常(下標(biāo)越界,被0-除等),而是由用戶自己定義的異常.用戶定義的異常同樣要用try--catch捕獲,但必須由用戶自己拋出thrownewMyException.異常是一個類,用戶定義的異常必須繼承自Throwable或Exception類,建議用Exception類.異常處理
創(chuàng)造自己的異常形如:classMyExceptionextendsException{….};例1:計算兩個數(shù)之和,當(dāng)任意一個數(shù)超出范圍時,拋出自己的異常publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}異常處理publicintCalcAnswer(Stringstr1,Stringstr2)throwsNumberRangeException{intint1,int2;intanswer=-1;try{int1=Integer.parseInt(str1);int2=Integer.parseInt(str2);if((int1<10)||(int1>20)||(int2<10)||(int2>20)))
{NumberRangeExceptione=newNumberRangeException("Numbersnotwithinthespecifiedrange.");throwe;}answer=int1+int2;}cat
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工勞務(wù)合同簡易版2篇
- 攪拌機銷售合同范例3篇
- 新版視頻剪輯視頻合同3篇
- 新最完整房屋買賣合同范文3篇
- 教育培訓(xùn)服務(wù)合同協(xié)議書3篇
- 放牧合同書樣本全新版3篇
- 工業(yè)振動控制設(shè)備安裝工程合同書3篇
- 斷橋鋁門窗安裝招標(biāo)3篇
- 數(shù)量責(zé)任聲明3篇
- 撤銷委托決定3篇
- 2024-2030年中國金華火腿腌制項目可行性研究報告
- 2024-2030年中國家用小家電項目可行性研究報告
- 《隧道工程監(jiān)控量測》課件
- 環(huán)保項目荒山租賃協(xié)議模板
- xx單位政務(wù)云商用密碼應(yīng)用方案V2.0
- 2024年度校園體育設(shè)施維修保養(yǎng)合同
- 機電一體化項目職業(yè)技能大賽試題(SX-815Q)
- 電廠應(yīng)急物資培訓(xùn)
- 2025年春九年級語文下冊 第三單元綜合測試卷(人教陜西版)
- 吊裝起重作業(yè)安全培訓(xùn)課件
- 行政人員的培訓(xùn)
評論
0/150
提交評論