第10章 異常處理_第1頁(yè)
第10章 異常處理_第2頁(yè)
第10章 異常處理_第3頁(yè)
第10章 異常處理_第4頁(yè)
第10章 異常處理_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第10章 異常,什么是異常,異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的意外事件,它中斷指令的正常執(zhí)行。 Java中提供了一種獨(dú)特的處理異常的機(jī)制,通過(guò)異常來(lái)處理程序設(shè)計(jì)中出現(xiàn)的錯(cuò)誤。,本章內(nèi)容,10.1 異常處理 10.2 未捕捉的異常 10.3 try-catch語(yǔ)句 10.4 異常的傳遞 10.5 異常類層次結(jié)構(gòu) 10.6 I/O異常,10.1 異常處理,一個(gè)程序中發(fā)生的問(wèn)題可能產(chǎn)生異?;蝈e(cuò)誤 一個(gè)異常(exception)是一個(gè)定義非正常情況或錯(cuò)誤的對(duì)象,由程序或運(yùn)行時(shí)環(huán)境拋出,可根據(jù)需要進(jìn)行相應(yīng)的捕捉和處理。 一個(gè)錯(cuò)誤(error)類似于異常,不同之處是錯(cuò)誤代表不可恢復(fù)的問(wèn)題并且必須捕捉處理。

2、 Java中預(yù)定義了一組程序執(zhí)行中可能發(fā)生的異常和錯(cuò)誤。,引起異常拋出的問(wèn)題 試圖做除以0的除法 數(shù)組索引越界 找不到指定的文件 不能正常完成被請(qǐng)求的I/O操作 使用了空引用 執(zhí)行的操作違反了某種安全規(guī)則 ,異常的處理機(jī)制 每當(dāng)Java程序運(yùn)行過(guò)程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,即產(chǎn)生一個(gè)異常。一旦一個(gè)異常對(duì)象產(chǎn)生了,系統(tǒng)中就一定有相應(yīng)的機(jī)制來(lái)處理它,確保不會(huì)產(chǎn)生死機(jī)、死循環(huán)或其他對(duì)操作系統(tǒng)的損害,從而保證了整個(gè)程序運(yùn)行的安全性。這就是Java的異常處理機(jī)制。,Java中處理異常有兩種方式:捕獲異常、聲明拋棄異常。 捕獲異常

3、,就地解決,并使程序繼續(xù)執(zhí)行。 聲明拋出異常也就是將異常向外轉(zhuǎn)移,即將異常拋出方法之外,由調(diào)用該方法的環(huán)境去處理。,捕獲異常 當(dāng)Java運(yùn)行時(shí)系統(tǒng)得到一個(gè)異常對(duì)象時(shí),它將會(huì)沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,運(yùn)行時(shí)系統(tǒng)把當(dāng)前異常對(duì)象交給這個(gè)方法進(jìn)行處理,這一過(guò)程稱為捕獲(catch)異常。這是積極的異常處理機(jī)制。如果Java運(yùn)行時(shí)系統(tǒng)找不到可以捕獲異常的方法,則運(yùn)行時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也將退出。,10.2 未捕捉的異常,若程序不處理異常,則將非正常地終止執(zhí)行,并產(chǎn)生關(guān)于描述在何處發(fā)生什么異常的信息。 例:10.1 Zero.java

4、 試圖拋出除以0時(shí),拋出ArithmeticException異常,由于程序中沒(méi)有處理異常的代碼,所以當(dāng)異常發(fā)生時(shí)程序員將結(jié)束執(zhí)行,并打印有關(guān)異常的具體信息。 異常拋出時(shí)所打印輸出的信息提供了方法調(diào)用的堆棧跟蹤信息,捕獲異常是通過(guò)try-catch-finally語(yǔ)句實(shí)現(xiàn)的。 處理異常的程序結(jié)構(gòu)如下: try /接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生的異常,由catch中指定的程序處理 catch(要處理的異常種類和標(biāo)識(shí)符) /處理異常 catch(要處理的異常種類和標(biāo)識(shí)符) /處理異常 finally /最終處理 ,10.3 try-catch語(yǔ)句,try-catch-finally語(yǔ)句 1. t

5、ry 捕獲異常的第一步是用try選定捕獲異常的范圍,所有可能拋出異常的語(yǔ)句都放入try模塊中。 try模塊中的語(yǔ)句是程序正常流程要執(zhí)行的語(yǔ)句,但是在執(zhí)行過(guò)程中有可能出現(xiàn)異常。 2. catch(必有) 每個(gè)try代碼塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于處理try代碼塊中所生成的異常事件。catch語(yǔ)句只需要一個(gè)形式參數(shù)指明它所能夠捕獲的異常類型,這個(gè)類必須是Throwable的子類,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋棄的異常對(duì)象傳遞給catch塊。,在catch塊中是對(duì)異常對(duì)象進(jìn)行處理的代碼,與訪問(wèn)其它對(duì)象一樣,可以訪問(wèn)一個(gè)異常對(duì)象的變量或調(diào)用它的方法。getMessage( )是類Throwab

6、le所提供的方法,用來(lái)得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace( )用來(lái)跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。 例如:try.catch( FileNotFoundException e )System.out.println( message:“ +e.getMessage() );e.printStackTrace( System.out );catch( IOException e )System.out.println(e.getMessage() );,catch 語(yǔ)句的順序:捕獲異常的順序和catch語(yǔ)句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下

7、的catch語(yǔ)句就不再進(jìn)行匹配。因此,在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。 3.finally(可選)捕獲異常的最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語(yǔ)句都會(huì)被執(zhí)行。,聲明拋出異常,1. 拋出異常 在Java程序的執(zhí)行過(guò)程中,如果出現(xiàn)了異常事件,就會(huì)生成一個(gè)異常對(duì)象。生成的異常對(duì)象將傳遞給Java運(yùn)行時(shí)系統(tǒng),這一異常的產(chǎn)生和提交過(guò)程稱為拋棄(throw)異常。 2. 聲明拋棄

8、異常 如果一個(gè)方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時(shí),聲明拋棄(throws)異常。這是一種消極的異常處理機(jī)制。,1. 拋出異常,拋出異常就是產(chǎn)生異常對(duì)象的過(guò)程,首先要生成異常對(duì)象,異?;蛘哂商摂M機(jī)生成,或者由某些類的實(shí)例生成,也可以在程序中生成。在方法中,拋出異常對(duì)象是通過(guò)throw語(yǔ)句實(shí)現(xiàn)的。例如:IOException e=new IOException();throw e ;可以拋出的異常必須是Throwable或其子類的實(shí)例。下面的語(yǔ)句在編譯時(shí)將會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤:throw new String(want to throw);,2. 聲明拋出異常,如果在一個(gè)方法中生成了一個(gè)

9、異常,但是這一方法并不確切地知道該如何對(duì)這一異常事件進(jìn)行處理,這時(shí),一個(gè)方法就應(yīng)該聲明拋棄異常,使得異常對(duì)象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。 也就是說(shuō)拋出異常的方法和處理異常的方法不是同一個(gè)方法時(shí),則需聲明拋出異常。 用方法聲明中的throws子句指明。例如:public int read () throws IOException.,throws子句中同時(shí)可以指明多個(gè)異常,之間由逗號(hào)隔開(kāi)。例如: public static void main(String args) throws IOException, IndexOutOfBoundsException ,設(shè)想一個(gè)公司

10、用編碼表示自己的各種產(chǎn)品。一個(gè)產(chǎn)品編碼除其他信息外還包括:第一次位上的字符代表產(chǎn)品生產(chǎn)地,第47位上的4位整形數(shù)代表產(chǎn)品銷(xiāo)售地區(qū)。現(xiàn)禁止來(lái)自產(chǎn)地R的產(chǎn)品在地區(qū)號(hào)大于2000的銷(xiāo)售區(qū)進(jìn)行銷(xiāo)售。 例10.2 ProductCodes.java 讀用戶編碼,統(tǒng)計(jì)用戶輸入的禁銷(xiāo)產(chǎn)品編碼個(gè)數(shù)。,10.4 異常的傳遞,如果在一個(gè)異常的發(fā)生處沒(méi)有捕捉和處理異常,控制將立刻返回到產(chǎn)生該異常的方法的上一級(jí)調(diào)用方法,因此可以將程序設(shè)計(jì)為在上級(jí)調(diào)用方法(外層調(diào)用)中捕捉和處理異常。如果在上級(jí)調(diào)用方法中仍然沒(méi)有捕捉和處理該異常,慢控制將返回到上級(jí)調(diào)用方法的更上一級(jí)調(diào)用方法,這個(gè)過(guò)程稱為傳遞異常。異常將一直傳遞下去,直

11、到異常被捕捉和處理為止,或直到異常傳遞出main方法,這種將終止程序的執(zhí)行并產(chǎn)生異常信息。 如果要捕捉外層異常,則必須將可能產(chǎn)生異常的方法包含在一個(gè)try語(yǔ)句中,并且將try語(yǔ)句還應(yīng)該具有catch子句處理。 例10.3 Propagation.java 例10.4 ExceptionScope.java,10.5 異常類層次結(jié)構(gòu),在jdk中,每個(gè)包中都定義了異常類,而所有的異常類都直接或間接地繼承于java.lang.Throwable類。當(dāng)Java程序遇到不可預(yù)料的錯(cuò)誤時(shí),會(huì)實(shí)例化一個(gè)從Throwable類繼承的對(duì)象。 java中的異常類可分為兩大類: Error: 錯(cuò)誤Error類指的是

12、系統(tǒng)錯(cuò)誤或運(yùn)行環(huán)境出現(xiàn)的錯(cuò)誤,這些錯(cuò)誤一般是很?chē)?yán)重的錯(cuò)誤,即使捕捉到也無(wú)法處理,由Java虛擬機(jī)生成并拋出,包括系統(tǒng)崩潰、動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤等,在Java程序中不做處理。 Exception: 異常Exception類則是指一些可以被捕獲且可能恢復(fù)的異常情況,是一般程序中可預(yù)知的問(wèn)題。對(duì)于異??煞譃閮深悾?(1) 運(yùn)行時(shí)異常:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來(lái)處理。 (2) 非運(yùn)行時(shí)異常:在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤。,異常類的結(jié)構(gòu)層次,Exception類,1Exception類 Exception類的構(gòu)造方法 Exception類有兩種構(gòu)造方法: Excepti

13、on():沒(méi)有指定的消息串,直接構(gòu)造一個(gè)Exception。 Exception(String exp):根據(jù)參數(shù)提供的消息串,創(chuàng)建一個(gè)Exception。 例如,創(chuàng)建一個(gè)異常對(duì)象: Exception myExp=new Exception(“異常!”);,常用方法: Exception類的方法均繼承自Throwable類,可以為程序提供一些有關(guān)異常的信息,常用方法如下: String getMessage() :返回該異常所存儲(chǔ)的描述性字符串。 String toString():返回異常對(duì)象的詳細(xì)信息,包含該類名和指出所發(fā)生問(wèn)題的描述性消息的字符串。 void printStackTra

14、ce():將異常發(fā)生的路徑,即引起異常的方法調(diào)用嵌套序列打印到標(biāo)準(zhǔn)錯(cuò)誤流。 例如: System.out.println(myExp.getMessage(); 此語(yǔ)句可以將異常對(duì)象myExp的異常信息描述打印輸出,在屏幕上顯示“異常!”。,1用戶自定義異常 在程序中,可以創(chuàng)建自定義的異常類。用戶自定義的異常類都要直接或間接地繼承Exception類??砂凑障旅娴姆椒ㄗ远x一個(gè)異常類: (1) 創(chuàng)建一個(gè)繼承Exception類或者其它已存在的異常類的子類。 (2) 在該類中創(chuàng)建一個(gè)默認(rèn)的無(wú)參數(shù)構(gòu)造方法,該構(gòu)造方法以適當(dāng)?shù)腻e(cuò)誤消息作為輸入,調(diào)用它的超類的構(gòu)造方法。 (3) 再增加一個(gè)帶字符串參數(shù)

15、的構(gòu)造方法,該構(gòu)造方法以適當(dāng)?shù)腻e(cuò)誤消息作為輸入(還包括輸入的字符串)來(lái)調(diào)用其超類相應(yīng)的構(gòu)造方法。,例如,定義一個(gè)繼承于Exception類的用戶自定義異常類,語(yǔ)句如下: class MyException extends Exception MyException() super(“數(shù)據(jù)錯(cuò)誤!”); MyException(String exp) super(exp); 例10.5 CreatingException.java 例10.6 OutOfRangeException.java,3 可檢測(cè)異常和不可檢測(cè)異常 可檢測(cè)異常 一個(gè)可檢測(cè)異常必須由一個(gè)方法捕捉,或必須在可能拋出或傳遞異常的方

16、法的throws子句中列出來(lái)。 在一個(gè)方法的聲明頭中追加一個(gè)throws子句,就明確承諾了該方法在異常發(fā)生時(shí)將拋出或傳遞異常。 一個(gè)不可檢測(cè)異常則不需要使用throws子句。 對(duì)于可檢測(cè)異常,如果發(fā)生異常的方法不捕捉和處理這個(gè)異常,則必須在該方法定義的聲明中包含throws。 唯一的不可檢測(cè)異常是RuntimeException類的對(duì)象或該類的后代對(duì)象。,10.6 I/O異常,一個(gè)流是一個(gè)有序的字節(jié)序列;流可以用做輸入源或作為輸出的目的地。(輸入流/輸出流) 標(biāo)準(zhǔn)I/O流中有三種流:System.in;System.out; System.err,這些對(duì)象引用變量都聲明為public和stat

17、ic,可以通過(guò)System類直接訪問(wèn)。 一旦需要?jiǎng)?chuàng)建InputMismatchException異常對(duì)象。 Java標(biāo)準(zhǔn)類庫(kù)的java.io還提供了許多類,可定義具有不同特點(diǎn)的各種流,分別處理文件,內(nèi)存或字符串。,I/O類執(zhí)行的許多操作都可能拋出IOException異常。它是可檢測(cè)的。 由于I/O經(jīng)常處理外部資源,執(zhí)行I/O操作的程序因此可能產(chǎn)生許多問(wèn)題 例10.7 TestData.java,為何使用意外處理:,把出錯(cuò)處理和正常代碼分開(kāi)。比如有程序是處理文件,大家看流程,這個(gè)流程中充滿了錯(cuò)誤可能。 readFile 打開(kāi)文件;打不開(kāi)咋辦? 判斷大小;大小判斷失敗怎么辦?(磁帶) 分配內(nèi)存;

18、內(nèi)存不夠 讀入內(nèi)存;文件讀不出來(lái) 關(guān)掉文件; 文件關(guān)不掉。 解決方法:寫(xiě)大量的if語(yǔ)句。,傳統(tǒng)的錯(cuò)誤檢測(cè)和糾正,errorCodeType readFile initialize errorCode = 0; 打開(kāi)文件; if (打開(kāi)文件成功) 判斷文件長(zhǎng) if (文件長(zhǎng)取到) 分配內(nèi)存 if (分內(nèi)存成功) 讀入內(nèi)存 if (讀文件失敗) errorCode = -1; /讀文件判斷 else errorCode = -2; /分配內(nèi)存失敗 else errorCode = -3; /取不到文件長(zhǎng) 關(guān)閉文件; if (文件沒(méi)關(guān) ,從上面的流程可看出真正有用的代碼不多,就五條而已,其它全部是判斷錯(cuò)誤用的,主要邏輯都被錯(cuò)誤處理代碼混得看不清

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論