版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第六講例外(Exception)處理1、例外的概念2、例外的分類(Throwable/Exception)3、捕獲例外(try-catch-finally)4、聲明例外(throws)5、拋出例外(throw)6、創(chuàng)建自己的例外第六講例外(Exception)處理1、例外的概念11、例外的概念在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免的,如何處理錯誤?把錯誤交給誰去處理?程序又該如何從錯誤中恢復?這是任何程序設(shè)計語言都要解決的問題。所謂錯誤,是在程序運行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運行。為了加強程序的魯棒性(強壯性,robust),程序設(shè)計時,必須考慮到可能發(fā)生的異常事件并做出相應的處理。1、例外的概念在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免21、例外的概念在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。但是,這種錯誤處理機制會導致不少問題,因為在很多情況下需要知道錯誤產(chǎn)生的內(nèi)部細節(jié)。通常,用全局變量Errno來存儲一個異常事件的類型,這容易導致誤用,因為一個Errno的值有可能在被處理前被另外的錯誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。1、例外的概念在C語言中,通過使用if語句來判斷是否3沒有錯誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念沒有錯誤處理的程序:1、例外的概念41、例外的概念以常規(guī)方法處理錯誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常規(guī)方法處理錯誤:5以常規(guī)方法處理錯誤存在的問題:觀察前面的程序,大家會發(fā)現(xiàn)大部分精力花在出錯處理上了只把能夠想到的錯誤考慮到,對以外的情況無法處理程序可讀性差,大量的錯誤處理代碼混雜在程序中出錯返回信息量太少,無法更確切的了解錯誤狀況或原因1、例外的概念以常規(guī)方法處理錯誤存在的問題:1、例外的概念61、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蝈e誤,在Java中,錯誤被稱為例外(Exception),有時也把例外稱為異常。在一個方法的運行過程中,如果發(fā)生了例外,則這個方法(或者是Java虛擬機)生成一個代表該例外的對象(包含了該例外的詳細信息),并把它交給運行時系統(tǒng),運行時系統(tǒng)尋找相應的代碼來處理這一例外。我們把生成例外對象并把它提交給運行時系統(tǒng)的過程稱為拋棄(throw)一個例外。運行時系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。1、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓?1、例外的概念用例外的形式處理錯誤:{
try{
openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}
catch(fileopenFailed) {dosomething;}
catch(sizeDetermineFailed) {dosomething;}
catch(memoryAllocateFailed) {dosomething;}
catch(readFailed) {dosomething;}
catch(fileCloseFailed) {dosomething;}
finally {dosomething;}}1、例外的概念用例外的形式處理錯誤:81、例外的概念例外機制的優(yōu)點:把錯誤處理代碼從常規(guī)代碼中分離出來按錯誤類型和差別分組(類Exception,派生)對無法預測的錯誤的捕獲和處理(基類)克服了傳統(tǒng)方法的錯誤信息有限的問題(getMessage)把錯誤傳播給調(diào)用堆棧(比較:全局變量,返回值)method1method2method3method4探測拋出例外傳遞捕獲處理例外調(diào)用1、例外的概念例外機制的優(yōu)點:method1method2m91、例外的概念什么情況下使用例外機制?當方法因為自身無法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無法建立……處理在方法、類庫、類中拋出的例外如FileInputStream.read產(chǎn)生IOException在大的項目中采用統(tǒng)一的方式處理錯誤時如編寫一個文字處理器例外應該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應該用例外機制來處理例外處理用于使系統(tǒng)從故障中恢復提示信息/不產(chǎn)生無效的結(jié)果/釋放資源1、例外的概念什么情況下使用例外機制?10不同的例外處理策略關(guān)鍵性應用(處理所有例外)實驗軟件(可以忽略許多例外)處理例外時的注意事項終止程序會導致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯誤不要使用例外機制例外機制的處理比正常處理效率低1、例外的概念不同的例外處理策略1、例外的概念111、例外的概念例外機制的關(guān)鍵步驟try{…}定義可能產(chǎn)生例外的代碼段catch(Etypee){…}用于捕獲一個例外finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwe;用于拋出一個例外throwsEtype1,Etype2……用于聲明方法可能拋出的例外類型throw/throwstry-catch-finally1、例外的概念例外機制的關(guān)鍵步驟throw/throws121、例外的概念程序中的例外不外乎兩種情況:一種是運行環(huán)境不能滿足程序運行的要求而出錯;一種是程序要解決的問題的約束而導致的。不管是哪種情況,編寫程序時,程序員要考慮到程序運行時可能遇到的各種情況(條件),并進行處理;如果不能處理,或者不知該如何處理,就可以認為是一種錯誤,這時,就需要交給別人去處理。以前,是通過返回錯誤代碼來提示別人程序有錯誤;在Java中,則是通過例外機制通知別人出錯信息。1、例外的概念程序中的例外不外乎兩種情況:一種是運行環(huán)境不能131、例外的概念例外機制與常規(guī)的錯誤處理方法的不同之處在于:1、錯誤的表示方法:錯誤編碼——》對象2、錯誤處理方法:與常規(guī)代碼的分離、錯誤傳遞機制1、例外的概念例外機制與常規(guī)的錯誤處理方法的不同之處在于:142、例外的分類一個例外是由一個對象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫的每個類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。2、例外的分類一個例外是由一個對象來代表的,所有15
Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。
RuntimeException:Java虛擬機在運行時生成的例外,如被0除等系統(tǒng)錯誤、數(shù)組下標超范圍等,其產(chǎn)生比較頻繁,處理麻煩,對程序可讀性和運行效率影響太大。因此由系統(tǒng)檢測,用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當然,必要時,用戶可對其處理)。
Exception:一般程序中可預知的問題,其產(chǎn)生的例外可能會帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。2、例外的分類Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、162、例外的分類ThrowableErrorExceptionRuntimeException缺省的例外處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的例外處理2、例外的分類ThrowableErrorException172、例外的分類
——Throwable類的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream
s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException2、例外的分類Throwable()ThrowableErr1877:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:
t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:
thrownewThrowable("測試Throwable的用法。");138:}java.lang.Throwable:測試Throwable的用法。測試Throwable的用法。測試Throwable的用法。java.lang.Throwable:測試Throwable的用法。attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St1977:publicstaticvoidmain(String[]args){78:try{79:
testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:
t.printStackTrace(System.err);86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:
thrownewThrowable();138:}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St202、例外的分類
——一些常用的例外類Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2、例外的分類Error(allinjava.lang21Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2、例外的分類
——一些常用的例外類Exception(injava.lang)2、例外的分22RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2、例外的分類
——一些常用的例外類RuntimeException2、例外的分類23ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException……2、例外的分類
——一些常用的例外類Exception2、例外的分類24例外示例:(1)編譯時例外:在程序中必須對其進行處理,否則編譯器會指出錯誤。
在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時例外:程序中可以不做處理,直接由運行時系統(tǒng)來處理。2、例外的分類例外示例:2、例外的分類25Java的例外處理是通過3個關(guān)鍵詞來實現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)例外,系統(tǒng)就會拋出(throws)例外,可以通過例外的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。3、捕獲例外Java的例外處理是通過3個關(guān)鍵詞來實現(xiàn)的:tr26try代碼段包含可能產(chǎn)生例外的代碼try代碼段后跟有一個或多個catch代碼段每個catch代碼段聲明其能處理的一種特定類型的例外每個catch代碼段都是一段例外處理代碼程序繼續(xù)執(zhí)行最后一個catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標識符){//處理異常;}catch(要處理的異常種類和標識符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements3、捕獲例外try代碼段包含可能產(chǎn)生例外的代碼try{3、捕獲例外273、捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個例外,因此,它后面的catch語句進行捕獲時也要做相應的處理。
如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。3、捕獲例外try語句283、捕獲例外catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得例外類型,運行時系統(tǒng)通過參數(shù)值把被拋棄的例外對象傳遞給catch語句。程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當然也可以用一個catch語句處理多個例外類型,這時它的例外類型應該是這多個例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。3、捕獲例外catch語句29publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();
}catch(FileNotFoundExceptione){
…
}catch(IOExceptione){
…
}}}}catch(IOExceptione){…}catch(FileNotFoundExceptione){…//永遠不會被執(zhí)行}publicclassExceptionDemo}cat30catch(Exceptione)捕獲所有Exceptioncatch(Throwablet)捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒有相應的例外處理,則例外被交給上一層try代碼段進行處理例外處理的查找依據(jù)類型匹配原則順序進行第一個匹配的例外處理被執(zhí)行,當例外處理執(zhí)行完畢,程序接著最后一個catch代碼段后的語句執(zhí)行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復到事件處理狀態(tài)3、捕獲例外 ——catch語句catch(Exceptione)例外總是由距離產(chǎn)生例外313、捕獲例外 ——catch語句盡量避免用一般類型作為catch中指定要捕獲的類型。一般應該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,在例外處理中無法訪問try代碼段中聲明的變量因為此時try代碼段已經(jīng)退出了,例外處理所需要的任何信息一般都應該通過例外對象來傳遞在使用方法時盡量直接處理該方法可能產(chǎn)生的例外這樣你的程序就會更健壯在使用庫方法之前,應該先仔細閱讀說明文檔那里會介紹方法可能產(chǎn)生的例外以及例外產(chǎn)生的條件在使用各種例外類之前也應該先仔細閱讀說明文檔那里會介紹例外的具體含義及例外產(chǎn)生的條件3、捕獲例外盡量避免用一般類型作為catch中指定要捕獲的類32在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機制不該被用于流程控制,例外情形應該是很稀少的,而不是經(jīng)常性的在catch代碼段中的return語句用于退出方法,而不是返回到例外拋出點(throwpoint)3、捕獲例外 ——catch語句在catch代碼段中產(chǎn)生的例外不是由相同try的后續(xù)catc33publicclassTestTryCatchThrow{publicstaticvoidmain(String[]args){try{if(args.length<1){
thrownewException(“沒有參數(shù)!”);}InputStreamin=newFileInputStream(args[0]);//readInt可能產(chǎn)生IOException,EOFExceptioninti=in.readInt();System.out.println(“對出的整數(shù)為:”+);}catch(EOFExceptione){System.out.println(“錯誤:文件格式存在問題!”);}catch(IOExceptione){System.out.println(“錯誤:文件操作中出現(xiàn)問題!”);}catch(Exceptione){System.out.println(“錯誤:”+e.getMessage());}...}}publicclassTestTryCatchThrow343、捕獲例外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)閉打開的文件、刪除臨時文件等。3、捕獲例外finally語句35try{
in=newFileInputStream(“file1.txt”);對文件進行處理的程序;}catch(IOExceptione){//對文件異常進行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}finally在文件處理時非常有用例外的覆蓋finally代碼段中應該把可能產(chǎn)生例外的語句用try-catch保護起來if(in!=null){try{in.close();}catch(IOExceptione){…}}//使用try-catch結(jié)構(gòu),防止finally代碼段拋出例外try{finally在文件處理時非常有用例外的覆蓋if36如果在一個方法中生成了例外,但是該方法并不處理它產(chǎn)生的例外,而是沿著調(diào)用層次向上傳遞,交由調(diào)用它的方法來處理這些例外,這就是聲明例外。通常的情況是在該方法中并不確切知道改如何對這些例外進行處理,比如FileNotFoundException類例外,它由FileInputStream的構(gòu)造方法產(chǎn)生,但在其構(gòu)造方法中并不清楚如何處理它,是終止程序的執(zhí)行還是新生成一個文件,這需要由調(diào)用它的方法來處理。4、聲明例外(throws語句)如果在一個方法中生成了例外,但是該方法并不處理它產(chǎn)生的37聲明例外的方法聲明例外的方法是在產(chǎn)生異常的方法名后面加上要拋出(throws)的例外的列表:retTypemethodName([paramlist])throwsexceptionList如類FileInputStream中的read()方法是這樣定義的:publicintread()throwsIOException{…}throws子句中可以同時指明多個例外,說明該方法將不對這些例外進行處理,而是聲明拋棄它們。需要強調(diào)的是:對于非運行時例外,程序中必須要作處理,或者捕獲,或者聲明拋棄;而對于運行時例外,程序中則可不處理。4、聲明例外(throws語句)聲明例外的方法4、聲明例外(throws語句)38publicmethod1(){intx;try{x=System.in.read();compute(x);}catch(IOExceptionioe){System.out.println(“readerror”);}catch(ArithmeticExceptione){System.out.println(“devidedby0”);}}publicintcompute(intx)throwsArithmeticException{intz=100/x;returnz;}method1compute異常例外拋出處理調(diào)用publicmethod1()publicintco39非運行時例外Throwable、Exception運行時例外Error、RuntimeException當在一個方法的代碼中拋出一個受檢查的例外時,這個例外或者被方法中的try-catch結(jié)構(gòu)捕獲,或者在方法的throws語句中聲明編譯器檢查程序,保證所有非運行時例外都被程序顯式地處理ThrowableErrorExceptionRuntimeException4、聲明例外(throws語句)非運行時例外ThrowableErrorExceptionR405、拋出例外(throw語句)聲明例外首先必須生成例外。前面所提到的例外或者是由Java虛擬機生成,或者是由Java類庫中的某些類生成。事實上,我們在程序中也可以生成自己的例外對象,也即是例外可以不是出錯產(chǎn)生,而是人為地拋出。不論那種方式,生成例外對象都是通過throw語句實現(xiàn):
thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:拋出的例外必須是Throwable或其子類的實例。AmethodExceptionAnothermethod5、拋出例外(throw語句)聲明例外首先必須生成例41classJavaThrow{ 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);}classJavaThrowtrytrytry42任何從Throwable派生的類都可以用throw語句拋出,拋出例外用來表明程序遇到的錯誤無法正常執(zhí)行而需要例外處理thrownewMyException(“someinfomation”);例外可以由try代碼段中的語句拋出也可以從被try代碼段中調(diào)用的方法中拋出例外還可能產(chǎn)生于數(shù)組下標越界以及Java虛擬機內(nèi)部錯誤等Exception和Error是Throwable的直接派生類Exception,程序應該處理的例外Error代表系統(tǒng)嚴重錯誤,一般程序不處理這類錯誤例外拋出點后的代碼在拋出例外后不再執(zhí)行也可以說例外的拋出終止了代碼段的執(zhí)行5、拋出例外(throw語句)任何從Throwable派生的類都可以用throw語句拋出,436、創(chuàng)建自己的例外當我們在設(shè)計自己的類包時,應盡最大的努力為用戶提供最好的服務(wù),并且希望用戶不要濫用我們所提供的方法,當程序出現(xiàn)某些異常事件時,我們希望程序足夠健壯以從程序中恢復,這時就需要用到例外。在選擇例外類型時,可以使用Java類庫中已經(jīng)定義好的類,也可以自己定義例外類。自定義例外類不是由Java系統(tǒng)監(jiān)測到的例外(如數(shù)組下標越界,被0除等),而是由用戶自己定義的例外。自定義例外同樣要用try-catch-finally捕獲,但必須由用戶自己拋出(throw)。6、創(chuàng)建自己的例外當我們在設(shè)計自己的類包時,應盡44例外是一個類,自定義例外必須繼承自Throwable或Exception類。建議:
例外一定是不經(jīng)常發(fā)生的故障,應避免把控制流程作為例外處理盡量使用JDK提供的例外類:重用、便于理解用Exception/RuntimeException類:編譯時例外、運行時例外。一般不把自定義例外作為Error的子類,因為Error通常被用來表示系統(tǒng)內(nèi)部的嚴重故障。ThrowableErrorExceptionRuntimeException自定義例外處理例外是一個類,自定義例外必須繼承自Throwab456、創(chuàng)建自己的例外當自定義例外是從RuntimeException及其子類繼承而來時,該自定義例外是運行時例外,程序中可以不捕獲并處理它。當自定義例外是從Throwable、Exception及其其他子類繼承而來時,該自定義例外是編譯時例外,也即程序中必須捕獲并處理它。自定義例外的形式:classMyExceptionextendsException{…}6、創(chuàng)建自己的例外當自定義例外是從RuntimeEx466、創(chuàng)建自己的例外例1:計算兩個數(shù)之和,當任意一個數(shù)超出范圍時,拋出自己的例外。publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}6、創(chuàng)建自己的例外例1:計算兩個數(shù)之和,當任意一47publicintCalcAnswer(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;}catch(NumberFormatExceptione){System.out.println(e.toString());}returnanswer;}publicintCalcAnswer(Strings48publicvoidgetAnswer(){StringanswerStr;try{intanswer=CalcAnswer(“12”,“5”);answerStr=String.valueOf(answer);}catch(NumberRangeExceptione){answerStr=e.getMessage();}System.out.println(answerStr);}publicvoidgetAnswer()496、創(chuàng)建自己的例外例2:在定義銀行類時,若取錢數(shù)大于余額則作為異常處理(InsufficientFundsException)。思路:產(chǎn)生例外的條件是余額少于取額,因此是否拋出例外要先判斷該條件。確定產(chǎn)生例外的方法,應該在取錢方法(withdrawal)中產(chǎn)生例外InsufficientFundsException。處理例外安排在調(diào)用withdrawal的時候,因此withdrawal方法要聲明例外,由上級方法捕獲并處理。要定義好自己的例外。6、創(chuàng)建自己的例外例2:在定義銀行類時,若取錢數(shù)大于余額則作50publicclassInsufficientFundsExceptionextendsException{privateBankexcepbank;privatedoubleexcepAmount;
InsufficientFundsException(Bankba,doubledAmount){excepbank=ba;excepAmount=dAmount;}publicStringexcepMesagge(){Stringstr=“Thebalance”+excepbank.getbalance()+“Thewithdrawalwas”+excepAmount;returnstr;}}publicclassInsufficientFunds51classBank{doublebalance;//余額Bank(doubleb){balance=b;}publicvoiddeposite(doubledAmount)//存錢{if(dAmount>0.0)balance+=dAmount;}publicvoidwithdrawal(doubledAmount)throwsInsufficientFundsException{if(balance<dAmout){
thrownewInsufficientFundsException(this,dAmount);}balance=balance-dAmount;}publicdoublegetbalance()//獲取余額{returnbalance;}}classBank52publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{Bankba=newBank(50);ba.withdrawal(100);System.out.println(“Withdrawalsuccessful!”);}catch(Exceptione){System.out.println(e.toString());}}}publicclassExceptionDemo53小結(jié)例外處理的一般格式:Java的例外處理機制使得處理例外的代碼和“常規(guī)”代碼分開,減少了代碼的數(shù)量,增強了程序的可讀性(可以對比用if語句來處理例外的情形,這時需要進行一系列條件的判定)。try{
Javastatement;}catche(ExceptionType1ExceptionObject1){
ExceptionObject1handling;}catche(ExceptionType2ExceptionObject2){
ExceptionObject2handling;}…}finally{
finalhandling;//統(tǒng)一的出口,最終必定要執(zhí)行}小結(jié)例外處理的一般格式:Java的例外處理機制使得處理例外54
Java的例外處理機制使得例外事件可以沿調(diào)用堆棧自動向上傳播,沿著被調(diào)用的順序往前尋找,只要找到符合該例外種類的例外處理程序,就交給這部分程序去處理。而不是C語言中通過函數(shù)的返回值來傳播,這樣可以傳遞更多的信息并且簡化代碼的編寫。小結(jié)Method1Method2Method3Read-filecallcallcalltry-catch產(chǎn)生異常throwsthrowsthrowsJava的例外處理機制使得例外事件可以沿調(diào)用堆棧自動向上傳55小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM行例外處理,把各種不同的例外事件進行分類,體現(xiàn)了良好的層次性,提供了良好的接口,這種機制對于具有動態(tài)運行特性的復雜程序提供了強有力的控制。由于把例外事件當成對象來處理,利用類的層次性可以把多個具有相同父類的例外統(tǒng)一處理,也可以區(qū)分不同的例外分別處理,使用非常靈活。當然,從另一方面來看,在捕獲或聲明例外時,要選取合適類型的例外類,注意例外的類層次,根據(jù)不同的情況使用一般或特殊的例外類。應該根據(jù)具體的情況選擇在何處處理例外?;蛘咴诜椒▋?nèi)捕獲并處理,或者用throws子句把它交給調(diào)用棧中上層的方法去處理。小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM行例外處理,把各種不同的例56對非運行時例外(編譯時例外)必須捕獲或聲明。對運行時例外,若不能預測它何時發(fā)生,程序可不作處理,而是交給Java運行時系統(tǒng)來處理;若能預知它可能發(fā)生的地點和時間,則應在程序中處理,而不應簡單地交給運行時系統(tǒng)。例外可以人為地拋出,用thrownewExceptionType()語句。例外可以是系統(tǒng)已經(jīng)定義好的,也可以是用戶自己定義的。用戶自己定義的例外一定要繼承自Throwable或Exception等類。在自定義例外類時,如果它所對應的異常事件通??偸窃谶\行時產(chǎn)生,而且不容易預測它將在何時何地發(fā)生,可以將它定義為運行時例外,否則應定義為非運行時(編譯時)例外。應該使用finally語句為例外處理提供統(tǒng)一的出口。小結(jié)對非運行時例外(編譯時例外)必須捕獲或聲明。對運行時例外,57演講完畢,謝謝觀看!演講完畢,謝謝觀看!58第六講例外(Exception)處理1、例外的概念2、例外的分類(Throwable/Exception)3、捕獲例外(try-catch-finally)4、聲明例外(throws)5、拋出例外(throw)6、創(chuàng)建自己的例外第六講例外(Exception)處理1、例外的概念591、例外的概念在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免的,如何處理錯誤?把錯誤交給誰去處理?程序又該如何從錯誤中恢復?這是任何程序設(shè)計語言都要解決的問題。所謂錯誤,是在程序運行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運行。為了加強程序的魯棒性(強壯性,robust),程序設(shè)計時,必須考慮到可能發(fā)生的異常事件并做出相應的處理。1、例外的概念在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免601、例外的概念在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。但是,這種錯誤處理機制會導致不少問題,因為在很多情況下需要知道錯誤產(chǎn)生的內(nèi)部細節(jié)。通常,用全局變量Errno來存儲一個異常事件的類型,這容易導致誤用,因為一個Errno的值有可能在被處理前被另外的錯誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。1、例外的概念在C語言中,通過使用if語句來判斷是否61沒有錯誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念沒有錯誤處理的程序:1、例外的概念621、例外的概念以常規(guī)方法處理錯誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常規(guī)方法處理錯誤:63以常規(guī)方法處理錯誤存在的問題:觀察前面的程序,大家會發(fā)現(xiàn)大部分精力花在出錯處理上了只把能夠想到的錯誤考慮到,對以外的情況無法處理程序可讀性差,大量的錯誤處理代碼混雜在程序中出錯返回信息量太少,無法更確切的了解錯誤狀況或原因1、例外的概念以常規(guī)方法處理錯誤存在的問題:1、例外的概念641、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蝈e誤,在Java中,錯誤被稱為例外(Exception),有時也把例外稱為異常。在一個方法的運行過程中,如果發(fā)生了例外,則這個方法(或者是Java虛擬機)生成一個代表該例外的對象(包含了該例外的詳細信息),并把它交給運行時系統(tǒng),運行時系統(tǒng)尋找相應的代碼來處理這一例外。我們把生成例外對象并把它提交給運行時系統(tǒng)的過程稱為拋棄(throw)一個例外。運行時系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。1、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓?51、例外的概念用例外的形式處理錯誤:{
try{
openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}
catch(fileopenFailed) {dosomething;}
catch(sizeDetermineFailed) {dosomething;}
catch(memoryAllocateFailed) {dosomething;}
catch(readFailed) {dosomething;}
catch(fileCloseFailed) {dosomething;}
finally {dosomething;}}1、例外的概念用例外的形式處理錯誤:661、例外的概念例外機制的優(yōu)點:把錯誤處理代碼從常規(guī)代碼中分離出來按錯誤類型和差別分組(類Exception,派生)對無法預測的錯誤的捕獲和處理(基類)克服了傳統(tǒng)方法的錯誤信息有限的問題(getMessage)把錯誤傳播給調(diào)用堆棧(比較:全局變量,返回值)method1method2method3method4探測拋出例外傳遞捕獲處理例外調(diào)用1、例外的概念例外機制的優(yōu)點:method1method2m671、例外的概念什么情況下使用例外機制?當方法因為自身無法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無法建立……處理在方法、類庫、類中拋出的例外如FileInputStream.read產(chǎn)生IOException在大的項目中采用統(tǒng)一的方式處理錯誤時如編寫一個文字處理器例外應該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應該用例外機制來處理例外處理用于使系統(tǒng)從故障中恢復提示信息/不產(chǎn)生無效的結(jié)果/釋放資源1、例外的概念什么情況下使用例外機制?68不同的例外處理策略關(guān)鍵性應用(處理所有例外)實驗軟件(可以忽略許多例外)處理例外時的注意事項終止程序會導致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯誤不要使用例外機制例外機制的處理比正常處理效率低1、例外的概念不同的例外處理策略1、例外的概念691、例外的概念例外機制的關(guān)鍵步驟try{…}定義可能產(chǎn)生例外的代碼段catch(Etypee){…}用于捕獲一個例外finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwe;用于拋出一個例外throwsEtype1,Etype2……用于聲明方法可能拋出的例外類型throw/throwstry-catch-finally1、例外的概念例外機制的關(guān)鍵步驟throw/throws701、例外的概念程序中的例外不外乎兩種情況:一種是運行環(huán)境不能滿足程序運行的要求而出錯;一種是程序要解決的問題的約束而導致的。不管是哪種情況,編寫程序時,程序員要考慮到程序運行時可能遇到的各種情況(條件),并進行處理;如果不能處理,或者不知該如何處理,就可以認為是一種錯誤,這時,就需要交給別人去處理。以前,是通過返回錯誤代碼來提示別人程序有錯誤;在Java中,則是通過例外機制通知別人出錯信息。1、例外的概念程序中的例外不外乎兩種情況:一種是運行環(huán)境不能711、例外的概念例外機制與常規(guī)的錯誤處理方法的不同之處在于:1、錯誤的表示方法:錯誤編碼——》對象2、錯誤處理方法:與常規(guī)代碼的分離、錯誤傳遞機制1、例外的概念例外機制與常規(guī)的錯誤處理方法的不同之處在于:722、例外的分類一個例外是由一個對象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫的每個類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。2、例外的分類一個例外是由一個對象來代表的,所有73
Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。
RuntimeException:Java虛擬機在運行時生成的例外,如被0除等系統(tǒng)錯誤、數(shù)組下標超范圍等,其產(chǎn)生比較頻繁,處理麻煩,對程序可讀性和運行效率影響太大。因此由系統(tǒng)檢測,用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當然,必要時,用戶可對其處理)。
Exception:一般程序中可預知的問題,其產(chǎn)生的例外可能會帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。2、例外的分類Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、742、例外的分類ThrowableErrorExceptionRuntimeException缺省的例外處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的例外處理2、例外的分類ThrowableErrorException752、例外的分類
——Throwable類的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream
s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException2、例外的分類Throwable()ThrowableErr7677:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:
t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:
thrownewThrowable("測試Throwable的用法。");138:}java.lang.Throwable:測試Throwable的用法。測試Throwable的用法。測試Throwable的用法。java.lang.Throwable:測試Throwable的用法。attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St7777:publicstaticvoidmain(String[]args){78:try{79:
testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:
t.printStackTrace(System.err);86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:
thrownewThrowable();138:}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St782、例外的分類
——一些常用的例外類Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2、例外的分類Error(allinjava.lang79Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2、例外的分類
——一些常用的例外類Exception(injava.lang)2、例外的分80RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2、例外的分類
——一些常用的例外類RuntimeException2、例外的分類81ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException……2、例外的分類
——一些常用的例外類Exception2、例外的分類82例外示例:(1)編譯時例外:在程序中必須對其進行處理,否則編譯器會指出錯誤。
在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時例外:程序中可以不做處理,直接由運行時系統(tǒng)來處理。2、例外的分類例外示例:2、例外的分類83Java的例外處理是通過3個關(guān)鍵詞來實現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)例外,系統(tǒng)就會拋出(throws)例外,可以通過例外的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。3、捕獲例外Java的例外處理是通過3個關(guān)鍵詞來實現(xiàn)的:tr84try代碼段包含可能產(chǎn)生例外的代碼try代碼段后跟有一個或多個catch代碼段每個catch代碼段聲明其能處理的一種特定類型的例外每個catch代碼段都是一段例外處理代碼程序繼續(xù)執(zhí)行最后一個catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標識符){//處理異常;}catch(要處理的異常種類和標識符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements3、捕獲例外try代碼段包含可能產(chǎn)生例外的代碼try{3、捕獲例外853、捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個例外,因此,它后面的catch語句進行捕獲時也要做相應的處理。
如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。3、捕獲例外try語句863、捕獲例外catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得例外類型,運行時系統(tǒng)通過參數(shù)值把被拋棄的例外對象傳遞給catch語句。程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當然也可以用一個catch語句處理多個例外類型,這時它的例外類型應該是這多個例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。3、捕獲例外catch語句87publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();
}catch(FileNotFoundExceptione){
…
}catch(IOExceptione){
…
}}}}catch(IOExceptione){…}catch(FileNotFoundExceptione){…//永遠不會被執(zhí)行}publicclassExceptionDemo}cat88catch(Exceptione)捕獲所有Exceptioncatch(Throwablet)捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒有相應的例外處理,則例外被交給上一層try代碼段進行處理例外處理的查找依據(jù)類型匹配原則順序進行第一個匹配的例外處理被執(zhí)行,當例外處理執(zhí)行完畢,程序接著最后一個catch代碼段后的語句執(zhí)行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復到事件處理狀態(tài)3、捕獲例外 ——catch語句catch(Exceptio
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32T-防汛抗旱特征水位核定規(guī)程編制說明
- 海南省??谑?024-2025學年四年級(上)期末語文試卷(含答案)
- 2025年社會服務(wù)行業(yè)投資策略報告:穩(wěn)舵定錨行致遠奮楫揚帆譜新篇
- 球的表面積和體積課件
- 【大學課件】單片機的系統(tǒng)擴展
- 經(jīng)濟學馬曉蓮課件房地產(chǎn)市場研究分析
- 中國證券市場供需格局及未來發(fā)展趨勢報告
- 2025年容積泵項目可行性研究報告
- 中國陶瓷耐磨磚項目投資可行性研究報告
- 2025共同出資合作開發(fā)地塊合同模板
- Python數(shù)據(jù)分析與應用 課件 第12章 Seaborn
- 初三歷史復習備考策略
- 廣東省云浮市(2024年-2025年小學五年級語文)人教版期末考試(上學期)試卷及答案
- 國潮風中國風2025蛇年大吉蛇年模板
- 《信托知識培訓》課件
- 物業(yè)項目經(jīng)理崗位競聘
- 第8課《蒲柳人家(節(jié)選)》教學設(shè)計-2023-2024學年統(tǒng)編版語文九年級下冊
- 幼兒沙池活動指導方法
- 2024年冬季校園清雪合同
- 翻譯美學理論
- 15J403-1-樓梯欄桿欄板(一)
評論
0/150
提交評論