版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
異常處理異常異常的概念異常的分類(lèi)捕獲異常聲明異常拋出異常創(chuàng)造自己的異??偨Y(jié)異常處理
異常的概念什么是異常?
異常實(shí)際上是程序中錯(cuò)誤導(dǎo)致中斷了正常的指令流的一種事件.沒(méi)有處理錯(cuò)誤的程序:
read-file{openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}異常處理異常的概念以常規(guī)方法處理錯(cuò)誤
openFiles;if(the){determinethelenthofthefile;if(gotThe){allocatethatmuchmemory;if(gotEnoughMemory){readthememory;if(readFailed)errorCode=-1;elseerrorCode=1;}elseerrorCode=-3;}elseerrorCode=-5;}elseerrorCode=-5;異常處理
異常的概念觀(guān)察前面的程序你會(huì)發(fā)現(xiàn)大部分精力花在出錯(cuò)處理上了.只把能夠想到的錯(cuò)誤考慮到,對(duì)以外的情況無(wú)法處理程序可讀性差出錯(cuò)返回信息量太少異常處理
異常的概念用異常的形式處理錯(cuò)誤read-File;{try{
openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}catch(){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(){dosomething;}catch(Exception){dosomething;}//其它未考慮到的錯(cuò)誤
}異常處理異常的概念和傳統(tǒng)的方法比較異常的優(yōu)點(diǎn):1.把錯(cuò)誤代碼從常規(guī)代碼中分離出來(lái)2.把錯(cuò)誤傳播給調(diào)用堆棧3.按錯(cuò)誤類(lèi)型和錯(cuò)誤差別分組4.系統(tǒng)提供了對(duì)于一些無(wú)法預(yù)測(cè)的錯(cuò)誤的捕獲和處理5.克服了傳統(tǒng)方法的錯(cuò)誤信息有限的問(wèn)題method1method2method3method4探測(cè)拋出例外傳遞捕獲處理例外調(diào)用異常處理什么情況下使用例外機(jī)制?當(dāng)方法因?yàn)樽陨頍o(wú)法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無(wú)法建立……處理在方法、類(lèi)庫(kù)、類(lèi)中拋出的例外如產(chǎn)生IOException在大的項(xiàng)目中采用統(tǒng)一的方式處理例外時(shí)如編寫(xiě)一個(gè)文字處理器例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應(yīng)該用例外機(jī)制來(lái)處理例外處理用于使系統(tǒng)從故障中恢復(fù)提示信息/不產(chǎn)生無(wú)效的結(jié)果/釋放資源異常的概念異常處理不同的例外處理策略關(guān)鍵性應(yīng)用(處理所有例外)實(shí)驗(yàn)軟件(可以忽略許多例外)處理例外時(shí)的注意事項(xiàng)終止程序會(huì)導(dǎo)致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯(cuò)誤不要使用例外機(jī)制例外機(jī)制的處理比正常處理效率低異常的概念異常處理
異常的概念.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();}異常處理異常的分類(lèi)異常是一個(gè)對(duì)象,它繼承自Throwable類(lèi),所有的Throwable類(lèi)的子孫類(lèi)所產(chǎn)生的對(duì)象都是例外.Error:由Java虛擬機(jī)生成并拋出,Java程序不做處理.RuntimeException(被0除等系統(tǒng)錯(cuò)誤,數(shù)組下標(biāo)超范圍):由系統(tǒng)檢測(cè),用戶(hù)的Java程序可不做處理,系統(tǒng)將它們交給缺省的異常處理程序.Exception(程序中的問(wèn)題,可預(yù)知的):Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時(shí)異常throw:用戶(hù)自己產(chǎn)生異常異常處理異常的分類(lèi)異常處理異常的分類(lèi).ThrowableErrorExceptionRuntimeException缺省的異常處理程序由用戶(hù)捕獲或聲明并處理不做處理用戶(hù)自己產(chǎn)生的異常要處理異常處理例外的分類(lèi)
一個(gè)例外是由一個(gè)對(duì)象來(lái)代表的,所有的例外都直接或間接地繼承自Throwable類(lèi)。在Java類(lèi)庫(kù)的每個(gè)類(lèi)包中都定義了例外類(lèi),這些例外類(lèi)分成兩大類(lèi):Error類(lèi)及Exception類(lèi),后者是Java程序中需要大量處理的。除了Java類(lèi)庫(kù)所定義的例外類(lèi)之外,用戶(hù)也可以通過(guò)繼承已有的例外類(lèi)來(lái)定義自己的例外類(lèi),并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。異常處理
Error:由Java虛擬機(jī)生成并拋出,包括動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤等,Java程序不做處理。
RuntimeException:Java虛擬機(jī)在運(yùn)行時(shí)生成的例外,如被0除等系統(tǒng)錯(cuò)誤、數(shù)組下標(biāo)超范圍等,其產(chǎn)生比較頻繁,處理麻煩,對(duì)程序可讀性和運(yùn)行效率影響太大。因此由系統(tǒng)檢測(cè),用戶(hù)可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當(dāng)然,必要時(shí),用戶(hù)可對(duì)其處理)。
Exception:一般程序中可預(yù)知的問(wèn)題,其產(chǎn)生的例外可能會(huì)帶來(lái)意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時(shí)異常。例外的分類(lèi)異常處理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("測(cè)試Throwable的用法。");}java.lang.Throwable:測(cè)試Throwable的用法。測(cè)試Throwable的用法。測(cè)試Throwable的用法。java.lang.Throwable:測(cè)試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)編譯時(shí)例外:在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤。
在使用能夠產(chǎn)生異常的方法而沒(méi)有捕獲和處理,程序?qū)⒉荒芡ㄟ^(guò)編譯。(2)運(yùn)行時(shí)例外:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來(lái)處理。例外的分類(lèi)異常處理捕獲異常捕獲并處理異常try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生
//的異常,由catch中指定的程序處理;}//不能有其它語(yǔ)句分隔catch(要處理的異常種類(lèi)和標(biāo)識(shí)符){//處理異常;}catch(要處理的異常種類(lèi)和標(biāo)識(shí)符){//處理異常;}異常處理捕獲例外try語(yǔ)句
捕獲例外的第一步就是用try{…}語(yǔ)句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過(guò)程中,該段代碼可能會(huì)產(chǎn)生并拋棄一個(gè)或多個(gè)例外,因此,它后面的catch語(yǔ)句進(jìn)行捕獲時(shí)也要做相應(yīng)的處理。
如果沒(méi)有例外產(chǎn)生,所有的catch代碼段都被略過(guò)不執(zhí)行。異常處理捕獲例外catch語(yǔ)句每個(gè)try語(yǔ)句必須伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應(yīng)的處理。catch語(yǔ)句有一個(gè)形式參數(shù),用于指明其所能捕獲得例外類(lèi)型,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋棄的例外對(duì)象傳遞給catch語(yǔ)句。程序設(shè)計(jì)中要根據(jù)具體的情況來(lái)選擇catch語(yǔ)句的例外處理類(lèi)型,一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類(lèi)型進(jìn)行捕獲和處理,盡量避免選擇最一般的類(lèi)型作為catch語(yǔ)句中指定要捕獲的類(lèi)型。當(dāng)然也可以用一個(gè)catch語(yǔ)句處理多個(gè)例外類(lèi)型,這時(shí)它的例外類(lèi)型應(yīng)該是這多個(gè)例外類(lèi)型的父類(lèi),但這種方式使得在程序中不能確切判斷例外的具體類(lèi)型。異常處理catch(Exceptione)
捕獲所有Exceptioncatch(Throwablet)
捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒(méi)有相應(yīng)的例外處理,則例外被交給上一層try代碼段進(jìn)行處理例外處理的查找依據(jù)類(lèi)型匹配原則順序進(jìn)行第一個(gè)匹配的例外處理被執(zhí)行,當(dāng)例外處理執(zhí)行完畢,程序接著最后一個(gè)catch代碼段后的語(yǔ)句執(zhí)行例外處理的順序影響到例外的處理子類(lèi)例外可被父類(lèi)例外處理捕獲不要先捕獲父類(lèi)例外,再捕獲子類(lèi)例外如果找不到相應(yīng)的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復(fù)到事件處理狀態(tài)捕獲例外
——catch語(yǔ)句異常處理捕獲例外
——catch語(yǔ)句盡量避免用一般類(lèi)型作為catch中指定要捕獲的類(lèi)型。一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類(lèi)型進(jìn)行捕獲和處理,在例外處理中無(wú)法訪(fǎng)問(wèn)try代碼段中聲明的變量因?yàn)榇藭r(shí)try代碼段已經(jīng)退出了,例外處理所需要的任何信息一般都應(yīng)該通過(guò)例外對(duì)象來(lái)傳遞在使用方法時(shí)盡量直接處理該方法可能產(chǎn)生的例外這樣你的程序就會(huì)更健壯在使用庫(kù)方法之前,應(yīng)該先仔細(xì)閱讀說(shuō)明文檔那里會(huì)介紹方法可能產(chǎn)生的例外以及例外產(chǎn)生的條件在使用各種例外類(lèi)之前也應(yīng)該先仔細(xì)閱讀說(shuō)明文檔那里會(huì)介紹例外的具體含義及例外產(chǎn)生的條件異常處理在catch代碼段中產(chǎn)生的例外不是由相同try的后續(xù)catch代碼段處理,而是由包含整個(gè)try-catch結(jié)構(gòu)的上層try代碼段檢測(cè)并處理可以把catch到的例外對(duì)象再次拋出,使上層try-catch結(jié)構(gòu)繼續(xù)處理該例外事件;也可以把例外對(duì)象轉(zhuǎn)換為其它例外對(duì)象…catch(Exceptione){throwe;}try-catch機(jī)制不該被用于流程控制,例外情形應(yīng)該是很稀少的,而不是經(jīng)常性的在catch代碼段中的return語(yǔ)句用于退出方法,而不是返回到例外拋出點(diǎn)(throwpoint)捕獲例外
——catch語(yǔ)句異常處理
捕獲異常常見(jiàn)的異常ArithmeticException//算術(shù)異常比如被零除ArrayIndexOutOfBoundsException//數(shù)組下標(biāo)越界ArrayStoreException//放入數(shù)組的類(lèi)型不符IOException//I/O異常//找不到文件異常NullPointerException//空指針異常MalformedURLException//url無(wú)法解析異常NumberFormatException//字符串轉(zhuǎn)換數(shù)值異常如果在使用能夠產(chǎn)生異常的方法而沒(méi)有捕獲和處理,將不能通過(guò)編譯異常處理
捕獲異常例:編寫(xiě)Java程序,包含三種異常算術(shù)異常,字符串越界,數(shù)組越界觀(guān)察輸出信息:每個(gè)異常對(duì)象可以直接給出信息異常處理捕獲異常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);}}}異常處理
捕獲異常一定會(huì)執(zhí)行的程序塊---finally異常處理的統(tǒng)一出口try{//常規(guī)的代碼;}catch(){//處理異常}finally{//不論發(fā)生什么異常(或者不發(fā)生任何異常),都要執(zhí)行的部分;}異常處理捕獲例外finally語(yǔ)句捕獲例外的最后一步是通過(guò)finally語(yǔ)句為例外處理提供一個(gè)統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。
無(wú)論try所指定的程序塊中是否拋出例外,也無(wú)論catch語(yǔ)句的例外類(lèi)型是否與所拋棄的例外的類(lèi)型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。(finally語(yǔ)句與switch中的default語(yǔ)句是不同的!)通常在finally語(yǔ)句中可以進(jìn)行資源的清除工作,如關(guān)閉打開(kāi)的文件、刪除臨時(shí)文件等。異常處理
聲明異常一個(gè)方法不處理它產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,由調(diào)用它的方法來(lái)處理這些異常,叫聲明異常.聲明異常的方法在產(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異常拋出處理異常處理
聲明異常例:說(shuō)出程序執(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異常處理
拋出異常拋棄異常:不是出錯(cuò)產(chǎn)生,而是人為地拋出throwThrowableObject;thrownewArithmeticException();例:編寫(xiě)程序人為拋出(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派生的類(lèi)對(duì)象都可以用throw語(yǔ)句拋出,拋出例外用來(lái)表明程序遇到的錯(cuò)誤無(wú)法正常執(zhí)行而需要例外處理thrownewMyException(“someinfomation”);例外可以由try代碼段中的語(yǔ)句拋出也可以從被try代碼段中調(diào)用的方法中拋出例外還可能產(chǎn)生于數(shù)組下標(biāo)越界以及Java虛擬機(jī)內(nèi)部錯(cuò)誤等Exception和Error是Throwable的直接派生類(lèi)Exception,程序應(yīng)該處理的例外Error代表系統(tǒng)嚴(yán)重錯(cuò)誤,一般程序不處理這類(lèi)錯(cuò)誤例外拋出點(diǎn)后的代碼在拋出例外后不再執(zhí)行也可以說(shuō)例外的拋出終止了代碼段的執(zhí)行拋出例外(throw語(yǔ)句)異常處理
創(chuàng)造自己的異常不是由Java系統(tǒng)監(jiān)測(cè)到的異常(下標(biāo)越界,被0-除等),而是由用戶(hù)自己定義的異常.用戶(hù)定義的異常同樣要用try--catch捕獲,但必須由用戶(hù)自己拋出thrownewMyException.異常是一個(gè)類(lèi),用戶(hù)定義的異常必須繼承自Throwable或Exception類(lèi),建議用Exception類(lèi).異常處理
創(chuàng)造自己的異常形如:classMyExceptionextendsException{….};例1:計(jì)算兩個(gè)數(shù)之和,當(dāng)任意一個(gè)數(shù)超出范圍時(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆河南省洛陽(yáng)市洛龍區(qū)第一實(shí)驗(yàn)校中考生物對(duì)點(diǎn)突破模擬試卷含解析
- 二零二五版電商公司電商運(yùn)營(yíng)售后服務(wù)合同模板2篇
- 2025年上半年遼陽(yáng)事業(yè)單位公開(kāi)招聘筆試重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 二零二五版環(huán)保節(jié)能設(shè)備研發(fā)與銷(xiāo)售合同3篇
- 2025年上半年遼寧省鐵嶺縣事業(yè)單位招聘(108人)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 二零二五版網(wǎng)絡(luò)安全保密及應(yīng)急響應(yīng)服務(wù)合同3篇
- 二零二五年度水利工程安全施工協(xié)議書(shū)2篇
- 2025年上半年貴州黔東南州直屬事業(yè)單位招聘工作人員83人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年貴州貴陽(yáng)廣播電視臺(tái)聘事業(yè)單位工作人員21人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年貴州省黔西南日?qǐng)?bào)社招考新聞采編聘用人員10人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 深圳2024-2025學(xué)年度四年級(jí)第一學(xué)期期末數(shù)學(xué)試題
- 中考語(yǔ)文復(fù)習(xí)說(shuō)話(huà)要得體
- 《工商業(yè)儲(chǔ)能柜技術(shù)規(guī)范》
- 華中師范大學(xué)教育技術(shù)學(xué)碩士研究生培養(yǎng)方案
- 醫(yī)院醫(yī)學(xué)倫理委員會(huì)章程
- 風(fēng)浪流耦合作用下錨泊式海上試驗(yàn)平臺(tái)的水動(dòng)力特性試驗(yàn)
- 高考英語(yǔ)語(yǔ)法專(zhuān)練定語(yǔ)從句含答案
- 有機(jī)農(nóng)業(yè)種植技術(shù)操作手冊(cè)
- 公園廣場(chǎng)綠地文化設(shè)施維修改造工程施工部署及進(jìn)度計(jì)劃
- 塑料件缺陷匯總
- 2020年的中國(guó)海外工程示范營(yíng)地申報(bào)材料及評(píng)分標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論