版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六講例外(Exception)處理1、例外的概念2、例外的分類(Throwable/Exception)3、捕獲例外(try-catch-finally)4、聲明例外(throws)5、拋出例外(throw)6、創(chuàng)建自己的例外第六講例外(Exception)處理1、例外的概念11、例外的概念在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的,如何處理錯(cuò)誤?把錯(cuò)誤交給誰去處理?程序又該如何從錯(cuò)誤中恢復(fù)?這是任何程序設(shè)計(jì)語言都要解決的問題。所謂錯(cuò)誤,是在程序運(yùn)行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運(yùn)行。為了加強(qiáng)程序的魯棒性(強(qiáng)壯性,robust),程序設(shè)計(jì)時(shí),必須考慮到可能發(fā)生的異常事件并做出相應(yīng)的處理。1、例外的概念在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免21、例外的概念在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯(cuò)誤,同時(shí),調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯(cuò)誤事件并進(jìn)行處理。但是,這種錯(cuò)誤處理機(jī)制會(huì)導(dǎo)致不少問題,因?yàn)樵诤芏嗲闆r下需要知道錯(cuò)誤產(chǎn)生的內(nèi)部細(xì)節(jié)。通常,用全局變量Errno來存儲(chǔ)一個(gè)異常事件的類型,這容易導(dǎo)致誤用,因?yàn)橐粋€(gè)Errno的值有可能在被處理前被另外的錯(cuò)誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。1、例外的概念在C語言中,通過使用if語句來判斷是否3沒有錯(cuò)誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念沒有錯(cuò)誤處理的程序:1、例外的概念41、例外的概念以常規(guī)方法處理錯(cuò)誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常規(guī)方法處理錯(cuò)誤:5以常規(guī)方法處理錯(cuò)誤存在的問題:觀察前面的程序,大家會(huì)發(fā)現(xiàn)大部分精力花在出錯(cuò)處理上了只把能夠想到的錯(cuò)誤考慮到,對(duì)以外的情況無法處理程序可讀性差,大量的錯(cuò)誤處理代碼混雜在程序中出錯(cuò)返回信息量太少,無法更確切的了解錯(cuò)誤狀況或原因1、例外的概念以常規(guī)方法處理錯(cuò)誤存在的問題:1、例外的概念61、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蝈e(cuò)誤,在Java中,錯(cuò)誤被稱為例外(Exception),有時(shí)也把例外稱為異常。在一個(gè)方法的運(yùn)行過程中,如果發(fā)生了例外,則這個(gè)方法(或者是Java虛擬機(jī))生成一個(gè)代表該例外的對(duì)象(包含了該例外的詳細(xì)信息),并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來處理這一例外。我們把生成例外對(duì)象并把它提交給運(yùn)行時(shí)系統(tǒng)的過程稱為拋棄(throw)一個(gè)例外。運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進(jìn)行回朔,直到找到包含相應(yīng)例外處理的方法為止,這一個(gè)過程稱為捕獲(catch)一個(gè)例外。1、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓?1、例外的概念用例外的形式處理錯(cuò)誤:{
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、例外的概念用例外的形式處理錯(cuò)誤:81、例外的概念例外機(jī)制的優(yōu)點(diǎn):把錯(cuò)誤處理代碼從常規(guī)代碼中分離出來按錯(cuò)誤類型和差別分組(類Exception,派生)對(duì)無法預(yù)測(cè)的錯(cuò)誤的捕獲和處理(基類)克服了傳統(tǒng)方法的錯(cuò)誤信息有限的問題(getMessage)把錯(cuò)誤傳播給調(diào)用堆棧(比較:全局變量,返回值)method1method2method3method4探測(cè)拋出例外傳遞捕獲處理例外調(diào)用1、例外的概念例外機(jī)制的優(yōu)點(diǎn):method1method2m91、例外的概念什么情況下使用例外機(jī)制?當(dāng)方法因?yàn)樽陨頍o法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無法建立……處理在方法、類庫(kù)、類中拋出的例外如FileInputStream.read產(chǎn)生IOException在大的項(xiàng)目中采用統(tǒng)一的方式處理錯(cuò)誤時(shí)如編寫一個(gè)文字處理器例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應(yīng)該用例外機(jī)制來處理例外處理用于使系統(tǒng)從故障中恢復(fù)提示信息/不產(chǎn)生無效的結(jié)果/釋放資源1、例外的概念什么情況下使用例外機(jī)制?10不同的例外處理策略關(guān)鍵性應(yīng)用(處理所有例外)實(shí)驗(yàn)軟件(可以忽略許多例外)處理例外時(shí)的注意事項(xiàng)終止程序會(huì)導(dǎo)致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯(cuò)誤不要使用例外機(jī)制例外機(jī)制的處理比正常處理效率低1、例外的概念不同的例外處理策略1、例外的概念111、例外的概念例外機(jī)制的關(guān)鍵步驟try{…}定義可能產(chǎn)生例外的代碼段catch(Etypee){…}用于捕獲一個(gè)例外finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwe;用于拋出一個(gè)例外throwsEtype1,Etype2……用于聲明方法可能拋出的例外類型throw/throwstry-catch-finally1、例外的概念例外機(jī)制的關(guān)鍵步驟throw/throws121、例外的概念程序中的例外不外乎兩種情況:一種是運(yùn)行環(huán)境不能滿足程序運(yùn)行的要求而出錯(cuò);一種是程序要解決的問題的約束而導(dǎo)致的。不管是哪種情況,編寫程序時(shí),程序員要考慮到程序運(yùn)行時(shí)可能遇到的各種情況(條件),并進(jìn)行處理;如果不能處理,或者不知該如何處理,就可以認(rèn)為是一種錯(cuò)誤,這時(shí),就需要交給別人去處理。以前,是通過返回錯(cuò)誤代碼來提示別人程序有錯(cuò)誤;在Java中,則是通過例外機(jī)制通知?jiǎng)e人出錯(cuò)信息。1、例外的概念程序中的例外不外乎兩種情況:一種是運(yùn)行環(huán)境不能131、例外的概念例外機(jī)制與常規(guī)的錯(cuò)誤處理方法的不同之處在于:1、錯(cuò)誤的表示方法:錯(cuò)誤編碼——》對(duì)象2、錯(cuò)誤處理方法:與常規(guī)代碼的分離、錯(cuò)誤傳遞機(jī)制1、例外的概念例外機(jī)制與常規(guī)的錯(cuò)誤處理方法的不同之處在于:142、例外的分類一個(gè)例外是由一個(gè)對(duì)象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫(kù)的每個(gè)類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫(kù)所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。2、例外的分類一個(gè)例外是由一個(gè)對(duì)象來代表的,所有15
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è),用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當(dāng)然,必要時(shí),用戶可對(duì)其處理)。
Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的例外可能會(huì)帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時(shí)異常。2、例外的分類Error:由Java虛擬機(jī)生成并拋出,包括動(dòng)態(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("測(cè)試Throwable的用法。");138:}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)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)編譯時(shí)例外:在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤。
在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運(yùn)行時(shí)例外:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來處理。2、例外的分類例外示例:2、例外的分類25Java的例外處理是通過3個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)例外,系統(tǒng)就會(huì)拋出(throws)例外,可以通過例外的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。3、捕獲例外Java的例外處理是通過3個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:tr26try代碼段包含可能產(chǎn)生例外的代碼try代碼段后跟有一個(gè)或多個(gè)catch代碼段每個(gè)catch代碼段聲明其能處理的一種特定類型的例外每個(gè)catch代碼段都是一段例外處理代碼程序繼續(xù)執(zhí)行最后一個(gè)catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常;}catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements3、捕獲例外try代碼段包含可能產(chǎn)生例外的代碼try{3、捕獲例外273、捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會(huì)產(chǎn)生并拋棄一個(gè)或多個(gè)例外,因此,它后面的catch語句進(jìn)行捕獲時(shí)也要做相應(yīng)的處理。
如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。3、捕獲例外try語句283、捕獲例外catch語句每個(gè)try語句必須伴隨一個(gè)或多個(gè)catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應(yīng)的處理。catch語句有一個(gè)形式參數(shù),用于指明其所能捕獲得例外類型,運(yùn)行時(shí)系統(tǒng)通過參數(shù)值把被拋棄的例外對(duì)象傳遞給catch語句。程序設(shè)計(jì)中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進(jìn)行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個(gè)catch語句處理多個(gè)例外類型,這時(shí)它的例外類型應(yīng)該是這多個(gè)例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。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){…//永遠(yuǎn)不會(huì)被執(zhí)行}publicclassExceptionDemo}cat30catch(Exceptione)捕獲所有Exceptioncatch(Throwablet)捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒有相應(yīng)的例外處理,則例外被交給上一層try代碼段進(jìn)行處理例外處理的查找依據(jù)類型匹配原則順序進(jìn)行第一個(gè)匹配的例外處理被執(zhí)行,當(dāng)例外處理執(zhí)行完畢,程序接著最后一個(gè)catch代碼段后的語句執(zhí)行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應(yīng)的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復(fù)到事件處理狀態(tài)3、捕獲例外 ——catch語句catch(Exceptione)例外總是由距離產(chǎn)生例外313、捕獲例外 ——catch語句盡量避免用一般類型作為catch中指定要捕獲的類型。一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進(jìn)行捕獲和處理,在例外處理中無法訪問try代碼段中聲明的變量因?yàn)榇藭r(shí)try代碼段已經(jīng)退出了,例外處理所需要的任何信息一般都應(yīng)該通過例外對(duì)象來傳遞在使用方法時(shí)盡量直接處理該方法可能產(chǎn)生的例外這樣你的程序就會(huì)更健壯在使用庫(kù)方法之前,應(yīng)該先仔細(xì)閱讀說明文檔那里會(huì)介紹方法可能產(chǎn)生的例外以及例外產(chǎn)生的條件在使用各種例外類之前也應(yīng)該先仔細(xì)閱讀說明文檔那里會(huì)介紹例外的具體含義及例外產(chǎn)生的條件3、捕獲例外盡量避免用一般類型作為catch中指定要捕獲的類32在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語句用于退出方法,而不是返回到例外拋出點(diǎn)(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(“對(duì)出的整數(shù)為:”+);}catch(EOFExceptione){System.out.println(“錯(cuò)誤:文件格式存在問題!”);}catch(IOExceptione){System.out.println(“錯(cuò)誤:文件操作中出現(xiàn)問題!”);}catch(Exceptione){System.out.println(“錯(cuò)誤:”+e.getMessage());}...}}publicclassTestTryCatchThrow343、捕獲例外finally語句捕獲例外的最后一步是通過finally語句為例外處理提供一個(gè)統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。
無論try所指定的程序塊中是否拋出例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。(finally語句與switch中的default語句是不同的?。┩ǔT趂inally語句中可以進(jìn)行資源的清除工作,如關(guān)閉打開的文件、刪除臨時(shí)文件等。3、捕獲例外finally語句35try{
in=newFileInputStream(“file1.txt”);對(duì)文件進(jìn)行處理的程序;}catch(IOExceptione){//對(duì)文件異常進(jìn)行處理;}finally{//不論是否發(fā)生異常,都關(guān)閉文件;}finally在文件處理時(shí)非常有用例外的覆蓋finally代碼段中應(yīng)該把可能產(chǎn)生例外的語句用try-catch保護(hù)起來if(in!=null){try{in.close();}catch(IOExceptione){…}}//使用try-catch結(jié)構(gòu),防止finally代碼段拋出例外try{finally在文件處理時(shí)非常有用例外的覆蓋if36如果在一個(gè)方法中生成了例外,但是該方法并不處理它產(chǎn)生的例外,而是沿著調(diào)用層次向上傳遞,交由調(diào)用它的方法來處理這些例外,這就是聲明例外。通常的情況是在該方法中并不確切知道改如何對(duì)這些例外進(jìn)行處理,比如FileNotFoundException類例外,它由FileInputStream的構(gòu)造方法產(chǎn)生,但在其構(gòu)造方法中并不清楚如何處理它,是終止程序的執(zhí)行還是新生成一個(gè)文件,這需要由調(diào)用它的方法來處理。4、聲明例外(throws語句)如果在一個(gè)方法中生成了例外,但是該方法并不處理它產(chǎn)生的37聲明例外的方法聲明例外的方法是在產(chǎn)生異常的方法名后面加上要拋出(throws)的例外的列表:retTypemethodName([paramlist])throwsexceptionList如類FileInputStream中的read()方法是這樣定義的:publicintread()throwsIOException{…}throws子句中可以同時(shí)指明多個(gè)例外,說明該方法將不對(duì)這些例外進(jìn)行處理,而是聲明拋棄它們。需要強(qiáng)調(diào)的是:對(duì)于非運(yùn)行時(shí)例外,程序中必須要作處理,或者捕獲,或者聲明拋棄;而對(duì)于運(yùn)行時(shí)例外,程序中則可不處理。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非運(yùn)行時(shí)例外Throwable、Exception運(yùn)行時(shí)例外Error、RuntimeException當(dāng)在一個(gè)方法的代碼中拋出一個(gè)受檢查的例外時(shí),這個(gè)例外或者被方法中的try-catch結(jié)構(gòu)捕獲,或者在方法的throws語句中聲明編譯器檢查程序,保證所有非運(yùn)行時(shí)例外都被程序顯式地處理ThrowableErrorExceptionRuntimeException4、聲明例外(throws語句)非運(yùn)行時(shí)例外ThrowableErrorExceptionR405、拋出例外(throw語句)聲明例外首先必須生成例外。前面所提到的例外或者是由Java虛擬機(jī)生成,或者是由Java類庫(kù)中的某些類生成。事實(shí)上,我們?cè)诔绦蛑幸部梢陨勺约旱睦鈱?duì)象,也即是例外可以不是出錯(cuò)產(chǎn)生,而是人為地拋出。不論那種方式,生成例外對(duì)象都是通過throw語句實(shí)現(xiàn):
thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:拋出的例外必須是Throwable或其子類的實(shí)例。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語句拋出,拋出例外用來表明程序遇到的錯(cuò)誤無法正常執(zhí)行而需要例外處理thrownewMyException(“someinfomation”);例外可以由try代碼段中的語句拋出也可以從被try代碼段中調(diào)用的方法中拋出例外還可能產(chǎn)生于數(shù)組下標(biāo)越界以及Java虛擬機(jī)內(nèi)部錯(cuò)誤等Exception和Error是Throwable的直接派生類Exception,程序應(yīng)該處理的例外Error代表系統(tǒng)嚴(yán)重錯(cuò)誤,一般程序不處理這類錯(cuò)誤例外拋出點(diǎn)后的代碼在拋出例外后不再執(zhí)行也可以說例外的拋出終止了代碼段的執(zhí)行5、拋出例外(throw語句)任何從Throwable派生的類都可以用throw語句拋出,436、創(chuàng)建自己的例外當(dāng)我們?cè)谠O(shè)計(jì)自己的類包時(shí),應(yīng)盡最大的努力為用戶提供最好的服務(wù),并且希望用戶不要濫用我們所提供的方法,當(dāng)程序出現(xiàn)某些異常事件時(shí),我們希望程序足夠健壯以從程序中恢復(fù),這時(shí)就需要用到例外。在選擇例外類型時(shí),可以使用Java類庫(kù)中已經(jīng)定義好的類,也可以自己定義例外類。自定義例外類不是由Java系統(tǒng)監(jiān)測(cè)到的例外(如數(shù)組下標(biāo)越界,被0除等),而是由用戶自己定義的例外。自定義例外同樣要用try-catch-finally捕獲,但必須由用戶自己拋出(throw)。6、創(chuàng)建自己的例外當(dāng)我們?cè)谠O(shè)計(jì)自己的類包時(shí),應(yīng)盡44例外是一個(gè)類,自定義例外必須繼承自Throwable或Exception類。建議:
例外一定是不經(jīng)常發(fā)生的故障,應(yīng)避免把控制流程作為例外處理盡量使用JDK提供的例外類:重用、便于理解用Exception/RuntimeException類:編譯時(shí)例外、運(yùn)行時(shí)例外。一般不把自定義例外作為Error的子類,因?yàn)镋rror通常被用來表示系統(tǒng)內(nèi)部的嚴(yán)重故障。ThrowableErrorExceptionRuntimeException自定義例外處理例外是一個(gè)類,自定義例外必須繼承自Throwab456、創(chuàng)建自己的例外當(dāng)自定義例外是從RuntimeException及其子類繼承而來時(shí),該自定義例外是運(yùn)行時(shí)例外,程序中可以不捕獲并處理它。當(dāng)自定義例外是從Throwable、Exception及其其他子類繼承而來時(shí),該自定義例外是編譯時(shí)例外,也即程序中必須捕獲并處理它。自定義例外的形式:classMyExceptionextendsException{…}6、創(chuàng)建自己的例外當(dāng)自定義例外是從RuntimeEx466、創(chuàng)建自己的例外例1:計(jì)算兩個(gè)數(shù)之和,當(dāng)任意一個(gè)數(shù)超出范圍時(shí),拋出自己的例外。publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}6、創(chuàng)建自己的例外例1:計(jì)算兩個(gè)數(shù)之和,當(dāng)任意一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í),若取錢數(shù)大于余額則作為異常處理(InsufficientFundsException)。思路:產(chǎn)生例外的條件是余額少于取額,因此是否拋出例外要先判斷該條件。確定產(chǎn)生例外的方法,應(yīng)該在取錢方法(withdrawal)中產(chǎn)生例外InsufficientFundsException。處理例外安排在調(diào)用withdrawal的時(shí)候,因此withdrawal方法要聲明例外,由上級(jí)方法捕獲并處理。要定義好自己的例外。6、創(chuàng)建自己的例外例2:在定義銀行類時(shí),若取錢數(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的例外處理機(jī)制使得處理例外的代碼和“常規(guī)”代碼分開,減少了代碼的數(shù)量,增強(qiáng)了程序的可讀性(可以對(duì)比用if語句來處理例外的情形,這時(shí)需要進(jìn)行一系列條件的判定)。try{
Javastatement;}catche(ExceptionType1ExceptionObject1){
ExceptionObject1handling;}catche(ExceptionType2ExceptionObject2){
ExceptionObject2handling;}…}finally{
finalhandling;//統(tǒng)一的出口,最終必定要執(zhí)行}小結(jié)例外處理的一般格式:Java的例外處理機(jī)制使得處理例外54
Java的例外處理機(jī)制使得例外事件可以沿調(diào)用堆棧自動(dòng)向上傳播,沿著被調(diào)用的順序往前尋找,只要找到符合該例外種類的例外處理程序,就交給這部分程序去處理。而不是C語言中通過函數(shù)的返回值來傳播,這樣可以傳遞更多的信息并且簡(jiǎn)化代碼的編寫。小結(jié)Method1Method2Method3Read-filecallcallcalltry-catch產(chǎn)生異常throwsthrowsthrowsJava的例外處理機(jī)制使得例外事件可以沿調(diào)用堆棧自動(dòng)向上傳55小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行例外處理,把各種不同的例外事件進(jìn)行分類,體現(xiàn)了良好的層次性,提供了良好的接口,這種機(jī)制對(duì)于具有動(dòng)態(tài)運(yùn)行特性的復(fù)雜程序提供了強(qiáng)有力的控制。由于把例外事件當(dāng)成對(duì)象來處理,利用類的層次性可以把多個(gè)具有相同父類的例外統(tǒng)一處理,也可以區(qū)分不同的例外分別處理,使用非常靈活。當(dāng)然,從另一方面來看,在捕獲或聲明例外時(shí),要選取合適類型的例外類,注意例外的類層次,根據(jù)不同的情況使用一般或特殊的例外類。應(yīng)該根據(jù)具體的情況選擇在何處處理例外?;蛘咴诜椒▋?nèi)捕獲并處理,或者用throws子句把它交給調(diào)用棧中上層的方法去處理。小結(jié)Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行例外處理,把各種不同的例56對(duì)非運(yùn)行時(shí)例外(編譯時(shí)例外)必須捕獲或聲明。對(duì)運(yùn)行時(shí)例外,若不能預(yù)測(cè)它何時(shí)發(fā)生,程序可不作處理,而是交給Java運(yùn)行時(shí)系統(tǒng)來處理;若能預(yù)知它可能發(fā)生的地點(diǎn)和時(shí)間,則應(yīng)在程序中處理,而不應(yīng)簡(jiǎn)單地交給運(yùn)行時(shí)系統(tǒng)。例外可以人為地拋出,用thrownewExceptionType()語句。例外可以是系統(tǒng)已經(jīng)定義好的,也可以是用戶自己定義的。用戶自己定義的例外一定要繼承自Throwable或Exception等類。在自定義例外類時(shí),如果它所對(duì)應(yīng)的異常事件通??偸窃谶\(yùn)行時(shí)產(chǎn)生,而且不容易預(yù)測(cè)它將在何時(shí)何地發(fā)生,可以將它定義為運(yùn)行時(shí)例外,否則應(yīng)定義為非運(yùn)行時(shí)(編譯時(shí))例外。應(yīng)該使用finally語句為例外處理提供統(tǒng)一的出口。小結(jié)對(duì)非運(yùn)行時(shí)例外(編譯時(shí)例外)必須捕獲或聲明。對(duì)運(yùn)行時(shí)例外,57演講完畢,謝謝觀看!演講完畢,謝謝觀看!58第六講例外(Exception)處理1、例外的概念2、例外的分類(Throwable/Exception)3、捕獲例外(try-catch-finally)4、聲明例外(throws)5、拋出例外(throw)6、創(chuàng)建自己的例外第六講例外(Exception)處理1、例外的概念591、例外的概念在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的,如何處理錯(cuò)誤?把錯(cuò)誤交給誰去處理?程序又該如何從錯(cuò)誤中恢復(fù)?這是任何程序設(shè)計(jì)語言都要解決的問題。所謂錯(cuò)誤,是在程序運(yùn)行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運(yùn)行。為了加強(qiáng)程序的魯棒性(強(qiáng)壯性,robust),程序設(shè)計(jì)時(shí),必須考慮到可能發(fā)生的異常事件并做出相應(yīng)的處理。1、例外的概念在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免601、例外的概念在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯(cuò)誤,同時(shí),調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯(cuò)誤事件并進(jìn)行處理。但是,這種錯(cuò)誤處理機(jī)制會(huì)導(dǎo)致不少問題,因?yàn)樵诤芏嗲闆r下需要知道錯(cuò)誤產(chǎn)生的內(nèi)部細(xì)節(jié)。通常,用全局變量Errno來存儲(chǔ)一個(gè)異常事件的類型,這容易導(dǎo)致誤用,因?yàn)橐粋€(gè)Errno的值有可能在被處理前被另外的錯(cuò)誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。1、例外的概念在C語言中,通過使用if語句來判斷是否61沒有錯(cuò)誤處理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念沒有錯(cuò)誤處理的程序:1、例外的概念621、例外的概念以常規(guī)方法處理錯(cuò)誤:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常規(guī)方法處理錯(cuò)誤:63以常規(guī)方法處理錯(cuò)誤存在的問題:觀察前面的程序,大家會(huì)發(fā)現(xiàn)大部分精力花在出錯(cuò)處理上了只把能夠想到的錯(cuò)誤考慮到,對(duì)以外的情況無法處理程序可讀性差,大量的錯(cuò)誤處理代碼混雜在程序中出錯(cuò)返回信息量太少,無法更確切的了解錯(cuò)誤狀況或原因1、例外的概念以常規(guī)方法處理錯(cuò)誤存在的問題:1、例外的概念641、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蝈e(cuò)誤,在Java中,錯(cuò)誤被稱為例外(Exception),有時(shí)也把例外稱為異常。在一個(gè)方法的運(yùn)行過程中,如果發(fā)生了例外,則這個(gè)方法(或者是Java虛擬機(jī))生成一個(gè)代表該例外的對(duì)象(包含了該例外的詳細(xì)信息),并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來處理這一例外。我們把生成例外對(duì)象并把它提交給運(yùn)行時(shí)系統(tǒng)的過程稱為拋棄(throw)一個(gè)例外。運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進(jìn)行回朔,直到找到包含相應(yīng)例外處理的方法為止,這一個(gè)過程稱為捕獲(catch)一個(gè)例外。1、例外的概念Java通過面向?qū)ο蟮姆椒▉硖幚沓?51、例外的概念用例外的形式處理錯(cuò)誤:{
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、例外的概念用例外的形式處理錯(cuò)誤:661、例外的概念例外機(jī)制的優(yōu)點(diǎn):把錯(cuò)誤處理代碼從常規(guī)代碼中分離出來按錯(cuò)誤類型和差別分組(類Exception,派生)對(duì)無法預(yù)測(cè)的錯(cuò)誤的捕獲和處理(基類)克服了傳統(tǒng)方法的錯(cuò)誤信息有限的問題(getMessage)把錯(cuò)誤傳播給調(diào)用堆棧(比較:全局變量,返回值)method1method2method3method4探測(cè)拋出例外傳遞捕獲處理例外調(diào)用1、例外的概念例外機(jī)制的優(yōu)點(diǎn):method1method2m671、例外的概念什么情況下使用例外機(jī)制?當(dāng)方法因?yàn)樽陨頍o法控制的原因而不能完成其任務(wù)文件不存在,網(wǎng)絡(luò)連接無法建立……處理在方法、類庫(kù)、類中拋出的例外如FileInputStream.read產(chǎn)生IOException在大的項(xiàng)目中采用統(tǒng)一的方式處理錯(cuò)誤時(shí)如編寫一個(gè)文字處理器例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障一定發(fā)生的事件不應(yīng)該用例外機(jī)制來處理例外處理用于使系統(tǒng)從故障中恢復(fù)提示信息/不產(chǎn)生無效的結(jié)果/釋放資源1、例外的概念什么情況下使用例外機(jī)制?68不同的例外處理策略關(guān)鍵性應(yīng)用(處理所有例外)實(shí)驗(yàn)軟件(可以忽略許多例外)處理例外時(shí)的注意事項(xiàng)終止程序會(huì)導(dǎo)致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯(cuò)誤不要使用例外機(jī)制例外機(jī)制的處理比正常處理效率低1、例外的概念不同的例外處理策略1、例外的概念691、例外的概念例外機(jī)制的關(guān)鍵步驟try{…}定義可能產(chǎn)生例外的代碼段catch(Etypee){…}用于捕獲一個(gè)例外finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwe;用于拋出一個(gè)例外throwsEtype1,Etype2……用于聲明方法可能拋出的例外類型throw/throwstry-catch-finally1、例外的概念例外機(jī)制的關(guān)鍵步驟throw/throws701、例外的概念程序中的例外不外乎兩種情況:一種是運(yùn)行環(huán)境不能滿足程序運(yùn)行的要求而出錯(cuò);一種是程序要解決的問題的約束而導(dǎo)致的。不管是哪種情況,編寫程序時(shí),程序員要考慮到程序運(yùn)行時(shí)可能遇到的各種情況(條件),并進(jìn)行處理;如果不能處理,或者不知該如何處理,就可以認(rèn)為是一種錯(cuò)誤,這時(shí),就需要交給別人去處理。以前,是通過返回錯(cuò)誤代碼來提示別人程序有錯(cuò)誤;在Java中,則是通過例外機(jī)制通知?jiǎng)e人出錯(cuò)信息。1、例外的概念程序中的例外不外乎兩種情況:一種是運(yùn)行環(huán)境不能711、例外的概念例外機(jī)制與常規(guī)的錯(cuò)誤處理方法的不同之處在于:1、錯(cuò)誤的表示方法:錯(cuò)誤編碼——》對(duì)象2、錯(cuò)誤處理方法:與常規(guī)代碼的分離、錯(cuò)誤傳遞機(jī)制1、例外的概念例外機(jī)制與常規(guī)的錯(cuò)誤處理方法的不同之處在于:722、例外的分類一個(gè)例外是由一個(gè)對(duì)象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫(kù)的每個(gè)類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫(kù)所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。2、例外的分類一個(gè)例外是由一個(gè)對(duì)象來代表的,所有73
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è),用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當(dāng)然,必要時(shí),用戶可對(duì)其處理)。
Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的例外可能會(huì)帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時(shí)異常。2、例外的分類Error:由Java虛擬機(jī)生成并拋出,包括動(dòng)態(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("測(cè)試Throwable的用法。");138:}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)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)編譯時(shí)例外:在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤。
在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運(yùn)行時(shí)例外:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來處理。2、例外的分類例外示例:2、例外的分類83Java的例外處理是通過3個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)例外,系統(tǒng)就會(huì)拋出(throws)例外,可以通過例外的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。3、捕獲例外Java的例外處理是通過3個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:tr84try代碼段包含可能產(chǎn)生例外的代碼try代碼段后跟有一個(gè)或多個(gè)catch代碼段每個(gè)catch代碼段聲明其能處理的一種特定類型的例外每個(gè)catch代碼段都是一段例外處理代碼程序繼續(xù)執(zhí)行最后一個(gè)catch代碼段后的代碼
(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生//的異常,由catch中指定的程序處理;}//不能有其它語句分隔catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常;}catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常;}…finally{//最終處理(缺省處理);}…//OtherStatements3、捕獲例外try代碼段包含可能產(chǎn)生例外的代碼try{3、捕獲例外853、捕獲例外try語句
捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會(huì)產(chǎn)生并拋棄一個(gè)或多個(gè)例外,因此,它后面的catch語句進(jìn)行捕獲時(shí)也要做相應(yīng)的處理。
如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。3、捕獲例外try語句863、捕獲例外catch語句每個(gè)try語句必須伴隨一個(gè)或多個(gè)catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應(yīng)的處理。catch語句有一個(gè)形式參數(shù),用于指明其所能捕獲得例外類型,運(yùn)行時(shí)系統(tǒng)通過參數(shù)值把被拋棄的例外對(duì)象傳遞給catch語句。程序設(shè)計(jì)中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進(jìn)行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個(gè)catch語句處理多個(gè)例外類型,這時(shí)它的例外類型應(yīng)該是這多個(gè)例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。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){…//永遠(yuǎn)不會(huì)被執(zhí)行}publicclassExceptionDemo}cat88catch(Exceptione)捕獲所有Exceptioncatch(Throwablet)捕獲Exception和Error例外總是由距離產(chǎn)生例外最近的匹配catch代碼段處理如果沒有相應(yīng)的例外處理,則例外被交給上一層try代碼段進(jìn)行處理例外處理的查找依據(jù)類型匹配原則順序進(jìn)行第一個(gè)匹配的例外處理被執(zhí)行,當(dāng)例外處理執(zhí)行完畢,程序接著最后一個(gè)catch代碼段后的語句執(zhí)行例外處理的順序影響到例外的處理子類例外可被父類例外處理捕獲不要先捕獲父類例外,再捕獲子類例外如果找不到相應(yīng)的例外處理非GUI程序?qū)⒔Y(jié)束程序執(zhí)行;Applet或GUI程序則回復(fù)到事件處理狀態(tài)3、捕獲例外 ——catch語句catch(Exceptio
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 選修課-足球教案
- 企業(yè)資產(chǎn)風(fēng)險(xiǎn)管理計(jì)劃
- 產(chǎn)品研發(fā)與加工合作協(xié)議
- D打印服務(wù)開發(fā)票協(xié)議書
- 傳統(tǒng)行業(yè)股份購(gòu)買協(xié)議模板
- 個(gè)人租賃簡(jiǎn)明合同樣本
- 代收款委托協(xié)議范本
- 企業(yè)入駐戰(zhàn)略融資租賃協(xié)議
- 企業(yè)員工委托培養(yǎng)合同
- 企業(yè)班車租賃協(xié)議
- 安全使用家電和煤氣課件
- 《GPS測(cè)量與數(shù)據(jù)處理》-第3講 全球定位系統(tǒng)組成及信號(hào)結(jié)構(gòu)
- 前置胎盤詳解課件
- 達(dá)爾文的“進(jìn)化論”課件
- 國(guó)開電大《建筑測(cè)量》實(shí)驗(yàn)報(bào)告1
- 《火災(zāi)自動(dòng)報(bào)警系統(tǒng)設(shè)計(jì)規(guī)范》
- 南京市小學(xué)一年級(jí)語文上學(xué)期期中試卷
- 合肥工業(yè)大學(xué)-孫冠東-答辯通用PPT模板
- 國(guó)開作業(yè)《管理學(xué)基礎(chǔ)》管理實(shí)訓(xùn):第一章訪問一個(gè)工商企業(yè)或一位管理者參考(含答案)280
- 食安員抽考必備知識(shí)考試題庫(kù)(含答案)
- 膀胱過度活動(dòng)癥的診斷與治療
評(píng)論
0/150
提交評(píng)論