java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)電子教案第07章_第1頁(yè)
java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)電子教案第07章_第2頁(yè)
java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)電子教案第07章_第3頁(yè)
java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)電子教案第07章_第4頁(yè)
java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)電子教案第07章_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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)介

第7章異常處理

異常是指程序在運(yùn)行過(guò)程中的不正常情況。在不支持異常處理的計(jì)算機(jī)語(yǔ)言中,錯(cuò)誤必須被手工檢查和處理,這種方法既笨拙又麻煩。Java的異常處理機(jī)制則避免了這些問(wèn)題,而且在處理過(guò)程中,把對(duì)運(yùn)行時(shí)錯(cuò)誤的處理以面向?qū)ο蟮姆绞浇鉀Q。7.1異常處理基礎(chǔ)7.2try和catch語(yǔ)句7.3異常拋出7.4finally語(yǔ)句7.5自定義異常類[Return]7.1異常處理基礎(chǔ)

本節(jié)介紹Java中有關(guān)異常處理的基礎(chǔ)知識(shí),包括異常的概念、異常的類型、Java的內(nèi)置異常等方面的內(nèi)容。7.1.1關(guān)于異常處理7.1.2異常的類型7.1.3Java的內(nèi)置異常7.1.4未被捕獲的異常[Return]7.1.1關(guān)于異常處理異常指的是程序運(yùn)行時(shí)出現(xiàn)的非正常情況,也稱為“例外”。在用傳統(tǒng)的語(yǔ)言編程時(shí),程序員只能通過(guò)函數(shù)的返回值來(lái)發(fā)出錯(cuò)誤信息,這易于導(dǎo)致很多錯(cuò)誤。Java對(duì)異常的處理是面向?qū)ο蟮?。一個(gè)Java的Exception是一個(gè)描述異常情況的對(duì)象。當(dāng)出現(xiàn)異常情況時(shí),一個(gè)Exception對(duì)象就產(chǎn)生了,并放到產(chǎn)生這個(gè)“異?!钡某蓡T函數(shù)里。Java異常(Exception)用于描述在代碼段中發(fā)生的異常。當(dāng)異常情況發(fā)生,一個(gè)代表該異常的對(duì)象被創(chuàng)建并在導(dǎo)致該錯(cuò)誤的方法中被引發(fā)(throw)。該方法可以選擇自己處理異?;騻鬟f該異常。兩種情況下,該異常被捕獲(caught)并處理。異常可能是由Java運(yùn)行時(shí)系統(tǒng)產(chǎn)生,或者是由手工代碼產(chǎn)生。被Java引發(fā)的異常與違反語(yǔ)言規(guī)范或超出Java執(zhí)行環(huán)境限制的基本錯(cuò)誤有關(guān)。手工編碼產(chǎn)生的異常基本上用于報(bào)告方法調(diào)用程序的出錯(cuò)狀況。Java中的異常處理通過(guò)5個(gè)關(guān)鍵字進(jìn)行控制:try、catch、throw、throws和

finally。下面是異常處理塊的一般形式:[Return]try{ //blockofcodetomonitorforerrors}catch(ExceptionType1exOb){

//exceptionhandlerforExceptionType1}catch(ExceptionType2exOb){

//exceptionhandlerforExceptionType2}//...finally{

//blockofcodetobeexecutedbeforetryblockends}其中,ExceptionType是發(fā)生異常的類型。7.1.2異常的類型

在“異?!鳖悓哟蔚淖钌蠈佑幸粋€(gè)單獨(dú)的類叫做Throwable。這個(gè)類用來(lái)表示所有的異常情況。每個(gè)異常類型都是Throwable的子類。Throwable有兩個(gè)直接的子類。一類是Exception,是用戶程序能夠捕捉到的異常情況。我們可通過(guò)產(chǎn)生它的子類來(lái)創(chuàng)建自己的異常。另一類是Error,它定義了那些通常無(wú)法捕捉到的“異常”。一般說(shuō)來(lái)要謹(jǐn)慎使用Error子類,因?yàn)樗鼈兺ǔ?huì)導(dǎo)致災(zāi)難性的失敗。在Exception中有一個(gè)子類RuntimeException,它是程序運(yùn)行時(shí)自動(dòng)地對(duì)某些錯(cuò)誤作出反應(yīng)而產(chǎn)生的。另一類分支由Error作為頂層,Error定義了在通常環(huán)境下不希望被程序捕獲的異常。Error類型的異常用于Java運(yùn)行時(shí)系統(tǒng)來(lái)顯示與運(yùn)行時(shí)系統(tǒng)本身有關(guān)的錯(cuò)誤。堆棧溢出是這種錯(cuò)誤的一例。本章將不討論關(guān)于Error類型的異常處理,因?yàn)樗鼈兺ǔJ菫?zāi)難性的致命錯(cuò)誤,不是你的程序可以隨意控制的。教材P175頁(yè)圖7-1顯示了異常和錯(cuò)誤的繼承層次關(guān)系。[Return]7.1.3Java的內(nèi)置異常

在標(biāo)準(zhǔn)包java.lang中,Java定義了若干個(gè)異常類。前面的例子曾用到其中一些。這些異常一般是標(biāo)準(zhǔn)類RuntimeException的子類。因?yàn)閖ava.lang實(shí)際上被所有的Java程序引入,多數(shù)從RuntimeException派生的異常都自動(dòng)可用。而且,它們不需要被包含在任何方法的throws列表中。Java語(yǔ)言中,這被叫做未經(jīng)檢查的異常(uncheckedexceptions)。因?yàn)榫幾g器不檢查它是否處理或引發(fā)了這些異常。java.lang中定義的未經(jīng)檢查的異常見(jiàn)教材P175頁(yè)表7-1中所列。教材P176頁(yè)表7-2中列出了由java.lang定義的必須在方法的throws列表中包括的異常,這些方法能產(chǎn)生其中的某個(gè)異常但是不能自己處理它,叫作受檢查異常(checkedexceptions)。Java定義了幾種與不同類庫(kù)相關(guān)的異常類型。[Return]7.1.4未被捕獲的異常

在學(xué)習(xí)如何處理程序中的異常之前,讓我們看一下如果不處理它們,將會(huì)有什么樣的情況發(fā)生。下面的小程序包括一個(gè)故意導(dǎo)致被零除錯(cuò)誤的表達(dá)式classExc0{ publicstaticvoidmain(Stringargs[]){ intd=0; inta=42/d; }}

當(dāng)Java運(yùn)行時(shí)系統(tǒng)檢查到被零除的情況,它構(gòu)造一個(gè)新的異常對(duì)象然后引發(fā)該異常。這導(dǎo)致Exc0的執(zhí)行停止,因?yàn)橐坏┮粋€(gè)異常被引發(fā),它必須被一個(gè)異常處理程序捕獲并且被立即處理。該例中,我們沒(méi)有提供任何我們自己的異常處理程序,所以異常被Java運(yùn)行時(shí)系統(tǒng)的默認(rèn)處理程序捕獲。任何不是被你程序捕獲的異常最終都會(huì)被該默認(rèn)處理程序處理。默認(rèn)處理程序顯示一個(gè)描述異常的字符串,打印異常發(fā)生處的堆棧軌跡并且終止程序。[Return]下面是由標(biāo)準(zhǔn)javaJDK運(yùn)行時(shí)解釋器執(zhí)行該程序所產(chǎn)生的輸出:java.lang.ArithmeticException:/byzero

atExc0.main(Exc0.java:5)其中,需要注意類名Exc0、方法名main、文件名Exc0.java和行數(shù)5是怎樣被包括在一個(gè)簡(jiǎn)單的堆棧使用軌跡中的。還有,注意引發(fā)的異常類型是Exception的一個(gè)名為ArithmeticException的子類,該子類更明確地描述了是何種類型的錯(cuò)誤方法。本章后面將討論Java提供的多個(gè)內(nèi)置的與可能產(chǎn)生的不同種類運(yùn)行時(shí)錯(cuò)誤相匹配的異常類型。堆棧軌跡將顯示導(dǎo)致錯(cuò)誤產(chǎn)生的方法調(diào)用序列。7.2try和catch語(yǔ)句

盡管由Java運(yùn)行時(shí)系統(tǒng)提供的默認(rèn)異常處理程序?qū)τ谡{(diào)試是很有用的,但通常是希望自己處理異常。這樣做有兩個(gè)好處:第一,它允許你修正錯(cuò)誤。第二,它防止程序自動(dòng)終止。本節(jié)將介紹相應(yīng)的方法。7.2.1try和catch的使用7.2.2顯示一個(gè)異常的描述7.2.3使用多重catch語(yǔ)句7.2.4嵌套try語(yǔ)句[Return]7.2.1try和catch的使用

為防止和處理一個(gè)運(yùn)行時(shí)錯(cuò)誤,只需要把所要監(jiān)控的代碼放進(jìn)一個(gè)try塊就可以了。緊跟著try塊的,包括一個(gè)說(shuō)明你所希望捕獲的錯(cuò)誤類型的catch子句。完成這個(gè)任務(wù)的方法很簡(jiǎn)單,下面的程序包含一個(gè)處理因?yàn)楸涣愠a(chǎn)生的ArithmeticException異常的try塊和一個(gè)catch子句。classExc2{publicstaticvoidmain(Stringargs[]){ intd,a; try{//monitorablockofcode. d=0; a=42/d; System.out.println("Thiswillnotbeprinted.");}catch(ArithmeticExceptione){//catchdivide-by-zeroerror System.out.println("Divisionbyzero."); } System.out.println("Aftercatchstatement.");}}[Return]7.2.2顯示一個(gè)異常的描述Throwable重載toString()方法(由Object定義),它返回一個(gè)包含異常描述的字符串??梢酝ㄟ^(guò)在println()中傳給異常一個(gè)參數(shù)來(lái)顯示該異常的描述。例如,前面程序的catch塊可以被重寫成:catch(ArithmeticExceptione){ System.out.println("Exception:"+e); a=0;//setatozeroandcontinue}

當(dāng)這個(gè)版本代替原程序中的版本,程序在標(biāo)準(zhǔn)javaJDK解釋器下運(yùn)行,每一個(gè)被零除錯(cuò)誤顯示下面的消息Exception:java.lang.ArithmeticException:/byzero盡管在上下文中沒(méi)有特殊的值,顯示一個(gè)異常描述的能力在其他情況下是很有價(jià)值的,特別是當(dāng)對(duì)異常進(jìn)行測(cè)試和調(diào)試時(shí)。[Return]7.2.3使用多重catch語(yǔ)句

某些情況,由單個(gè)代碼段可能引起多個(gè)異常。處理這種情況,你可以定義兩個(gè)或更多的catch子句,每個(gè)子句捕獲一種類型的異常。當(dāng)異常被引發(fā)時(shí),每一個(gè)catch子句被依次檢查,第一個(gè)匹配異常類型的子句執(zhí)行。當(dāng)一個(gè)catch語(yǔ)句執(zhí)行以后,其他的子句被旁路,執(zhí)行從try/catch塊以后的代碼開始繼續(xù)。當(dāng)用多個(gè)catch語(yǔ)句時(shí),需要記住異常子類必須在它們?nèi)魏胃割愔笆褂?,這一點(diǎn)是很重要的。因?yàn)檫\(yùn)用父類的catch語(yǔ)句將捕獲該類型及其所有子類類型的異常。這樣,如果子類在父類后面,子類將永遠(yuǎn)不會(huì)到達(dá)。而且,Java中不能到達(dá)的代碼是一個(gè)錯(cuò)誤。[Return]7.2.4嵌套try語(yǔ)句

在進(jìn)行異常處理時(shí),try語(yǔ)句可以被嵌套使用。也就是說(shuō),一個(gè)try語(yǔ)句可以在另一個(gè)try塊內(nèi)部。每次進(jìn)入try語(yǔ)句,異常的前后關(guān)系都會(huì)被推入堆棧。如果一個(gè)內(nèi)部的try語(yǔ)句不含特殊異常的catch處理程序,堆棧將彈出,下一個(gè)try語(yǔ)句的catch處理程序?qū)z查是否與之匹配。這個(gè)過(guò)程將繼續(xù)直到一個(gè)catch語(yǔ)句匹配成功,或者是直到所有的嵌套try語(yǔ)句被檢查耗盡。如果沒(méi)有catch語(yǔ)句匹配,Java在運(yùn)行時(shí)系統(tǒng)將處理這個(gè)異常。教材P180~181頁(yè)給出了一個(gè)運(yùn)用嵌套try語(yǔ)句的具體例子。[Return]7.3異常拋出

前面只是說(shuō)明了如何獲取Java運(yùn)行時(shí)被系統(tǒng)引發(fā)的異常。同時(shí),程序還可以用throw語(yǔ)句引發(fā)明確的異常,用throws語(yǔ)句來(lái)標(biāo)明一個(gè)成員函數(shù)可能拋出的各種異常。本節(jié)將對(duì)這方面的內(nèi)容進(jìn)行介紹。7.3.1throw語(yǔ)句7.3.2throws語(yǔ)句[Return]7.3.1throw語(yǔ)句

使用throw語(yǔ)句可以明確地拋出一個(gè)“異?!?。首先,必須得到一個(gè)Throwable的實(shí)例的控制柄,通過(guò)參數(shù)傳到catch子句,或者用new操作符來(lái)創(chuàng)建一個(gè)。下面是throw語(yǔ)句的一般使用形式:

throwThrowableInstance;這里,ThrowableInstance一定是Throwable類類型或Throwable子類類型的一個(gè)對(duì)象。簡(jiǎn)單類型,例如int或char,以及非Throwable類,例如String或Object,不能用作異常。有兩種可以獲得Throwable對(duì)象的方法:在catch子句中使用參數(shù)或者用new操作符創(chuàng)建。程序執(zhí)行在throw語(yǔ)句之后立即停止,后面的任何語(yǔ)句不被執(zhí)行。最緊緊包圍的try塊用來(lái)檢查它是否含有一個(gè)與異常類型匹配的catch語(yǔ)句。如果發(fā)現(xiàn)了匹配的塊,控制將轉(zhuǎn)向該語(yǔ)句;如果沒(méi)有發(fā)現(xiàn),次包圍的try塊來(lái)檢查,以此類推。如果沒(méi)有發(fā)現(xiàn)匹配的catch塊,默認(rèn)異常處理程序中斷程序的執(zhí)行并且打印堆棧軌跡。[Return]7.3.2throws語(yǔ)句

如果一個(gè)方法可以導(dǎo)致一個(gè)異常但不處理它,它必須指定這種行為以使方法的調(diào)用者可以保護(hù)它們自己而不發(fā)生異常。做到這點(diǎn)你可以在方法聲明中包含一個(gè)throws子句。一個(gè)throws子句列舉了一個(gè)方法可能引發(fā)的所有異常類型。這對(duì)于除Error或RuntimeException及它們子類以外類型的所有異常是必要的。一個(gè)方法可以引發(fā)的所有其他類型的異常必須在throws子句中聲明。如果不這樣做,將會(huì)導(dǎo)致編譯錯(cuò)誤。下面是包含一個(gè)throws子句的方法聲明的一般形式[Return]typemethod-name(parameter-list)throwsexception-list{

//bodyofmethod}這里,exception-list是該方法可以引發(fā)的以逗號(hào)分割的異常列表。7.4finally語(yǔ)句

當(dāng)一個(gè)“異?!北粧伋鰰r(shí),程序的執(zhí)行就不再是線性的:跳過(guò)某些行,甚至?xí)捎跊](méi)有與之匹配的catch子句而過(guò)早地返回。有時(shí)確保一段代碼不管發(fā)生什么“異常”都被執(zhí)行到是必要的,關(guān)鍵詞finally就是用來(lái)標(biāo)識(shí)這樣一段代碼的。即使你沒(méi)有catch子句,finally程序塊也會(huì)在執(zhí)行try程序塊后的程序之前執(zhí)行。每個(gè)try語(yǔ)句都需要至少一個(gè)與之相配的catch子句或finally子句。一個(gè)成員函數(shù)返回到調(diào)用它的成員函數(shù),或者通過(guò)一個(gè)沒(méi)捕捉到的“異?!?,或者通過(guò)一個(gè)明確的return語(yǔ)句,finally子句總是恰好在成員函數(shù)返回前執(zhí)行。下面是一個(gè)例子,它有幾個(gè)成員函數(shù),每個(gè)成員函數(shù)用不同的途徑退出,但執(zhí)行了finally子句。finally創(chuàng)建一個(gè)代碼

溫馨提示

  • 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)論