SUN-JAVA 培訓(xùn)專用教材C07_第1頁
SUN-JAVA 培訓(xùn)專用教材C07_第2頁
SUN-JAVA 培訓(xùn)專用教材C07_第3頁
SUN-JAVA 培訓(xùn)專用教材C07_第4頁
SUN-JAVA 培訓(xùn)專用教材C07_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、PAGE PAGE 107第七章 異 常本模塊講講述建立立在Jaava編編程語言言中的錯(cuò)錯(cuò)誤處理理裝置。第一節(jié) 相關(guān)關(guān)問題討論下下述問題題與本模模塊中的的材料相相關(guān):在大部分分編程語語言中,如如何解決決運(yùn)行時(shí)時(shí)錯(cuò)誤?第二節(jié) 目 的本模塊學(xué)學(xué)習(xí)結(jié)束束后,能能夠:定義異常常使用trry,ccatcch和finnallly語句句描述異常常分類開發(fā)程序序來處理理自己的的異常第三節(jié) 異 常異 常異常類定定義程序序所遇到到的輕微微錯(cuò)誤發(fā)生下列列情況時(shí)時(shí),會(huì)出出現(xiàn)異常常:想打開的的文件不不存在網(wǎng)絡(luò)連接接中斷受控操作作數(shù)超出出預(yù)定范范圍非常感興興趣地正正在裝載載的類文文件丟失失錯(cuò)誤類定定義嚴(yán)重重的錯(cuò)誤誤條件7

2、.3.1介紹紹什么是異異常?在在Javva編程程語言中中,異常常類定義義程序中中可能遇遇到的輕輕微的錯(cuò)錯(cuò)誤條件件。可以以寫代碼碼來處理理異常并并繼續(xù)程程序執(zhí)行行,而不不是讓程程序中斷斷。在程序執(zhí)執(zhí)行中,任任何中斷斷正常程程序流程程的異常常條件就就是錯(cuò)誤誤或異常常。例如如,發(fā)生生下列情情況時(shí),會(huì)會(huì)出現(xiàn)異異常:想打開的的文件不不存在網(wǎng)絡(luò)連接接中斷受控操作作數(shù)超出出預(yù)定范范圍非常感興興趣地正正在裝載載的類文文件丟失失 在Jaava編編程語言言中,錯(cuò)錯(cuò)誤類定定義被認(rèn)認(rèn)為是不不能恢復(fù)復(fù)的嚴(yán)重重錯(cuò)誤條條件。在在大多數(shù)數(shù)情況下下,當(dāng)遇遇到這樣樣的錯(cuò)誤誤時(shí),建建議讓程程序中斷斷。 Javva編程程語言實(shí)實(shí)現(xiàn)C

3、+異常常來幫助助建立彈彈性代碼碼。在程程序中發(fā)發(fā)生錯(cuò)誤誤時(shí),發(fā)發(fā)現(xiàn)錯(cuò)誤誤的方法法能拋出出一個(gè)異異常到其其調(diào)用程程序,發(fā)發(fā)出已經(jīng)經(jīng)發(fā)生問問題的信信號(hào)。然然后,調(diào)調(diào)用方法法捕獲拋拋出的異異常,在在可能時(shí)時(shí),再恢恢復(fù)回來來。這個(gè)個(gè)方案給給程序員員一個(gè)寫寫處理程程序的選選擇,來來處理異異常。通過瀏覽覽APII,可以以決定方方法拋出出的是什什么樣的的異常。7.3.2實(shí)例例考慮一下下HellloWWorlld.jjavaa程序版版本的簡(jiǎn)簡(jiǎn)單擴(kuò)展展,它通通過信息息來循環(huán)環(huán):publlic claass HellloWWorlld puubliic sstattic voiid mmainn (SStriin

4、g arggs) intt i = 00; Strringg grreettinggs = Helllo worrld!, No, I meaan iit!, HELLLO WORRLD! ; whiile (i javva HHellloWoorlddHelllo wworlld!No, I mmeann itt!HELLLO WWORLLD!javaa.laang.ArrrayIIndeexOuutOffBouundssExccepttionn: 33 at HellloWWorlld.mmainn(HeellooWorrld.javva:112) 異常處理理允許程程序捕獲獲異常,處處理它

5、們們,然后后繼續(xù)程程序執(zhí)行行。它是是分層把把關(guān),因因此,錯(cuò)錯(cuò)誤情況況不會(huì)介介入到程程序的正正常流程程中。特特殊情況況發(fā)生時(shí)時(shí),在與與正常執(zhí)執(zhí)行的代代碼分離離的代碼碼塊中被被處理。這就產(chǎn)產(chǎn)生了更更易識(shí)別別和管理理的代碼碼。第四節(jié) 異常常處理Javaa編程語語言提供供了一個(gè)個(gè)來考慮慮哪個(gè)異異常被拋拋出以及及如何來來恢復(fù)它它的機(jī)制制。7.4.1 tryy和cattch語語句try和和cattch語語句 trry / codde tthatt miightt thhroww a parrticculaar eexceeptiion cattch (MyyExccepttionnTyppe ee) /

6、codde tto eexeccutee iff a MyEExceeptiionTTypee exxcepptioon iis tthroown cattch (Exxcepptioon ee) / ccodee too exxecuute if a ggeneerall Exxcepptioon eexceeptiion is thrrownn 要處理特特殊的異異常,將將能夠拋拋出異常常的代碼碼放入ttry塊塊中,然然后創(chuàng)建建相應(yīng)的的cattch塊塊的列表表,每個(gè)個(gè)可以被被拋出異異常都有有一個(gè)。如果生生成的異異常與ccatcch中提提到的相相匹配,那那么caatchh條件的的塊語句句就被執(zhí)

7、執(zhí)行。在在tryy塊之后后,可能能有許多多cattch塊塊,每一一個(gè)都處處理不同同的異常常。1. tryy 2. / ccodee thhat migght thrrow a ppartticuularr exxcepptioon3. ccatcch (MyEExceeptiionTTypee e) 4. / ccodee too exxecuute if a MMyExxcepptioonTyype exccepttionn iss thhrowwn 5. ccatcch (Exccepttionn e) 6. / coode to exeecutte iif aa geenerral Ex

8、ccepttionn exxcepptioon iis tthroown 7. 7.4.2 調(diào)用棧棧機(jī)制如果方法法中的一一個(gè)語句句拋出一一個(gè)沒有有在相應(yīng)應(yīng)的trry/ccatcch塊中中處理的的異常,那那么這個(gè)個(gè)異常就就被拋出出到調(diào)用用方法中中。如果果異常也也沒有在在調(diào)用方方法中被被處理,它它就被拋拋出到該該方法的的調(diào)用程程序。這這個(gè)過程程要一直直延續(xù)到到異常被被處理。如果異異常到這這時(shí)還沒沒被處理理,它便便回到mmainn(),而而且,即即使maain()不處處理它,那那么,該該異常就就異常地地中斷程程序。考慮這樣樣一種情情況,在在該情況況中maain()方法法調(diào)用另另一個(gè)方方法(比比如,f

9、firsst()),然然后它調(diào)調(diào)用另一一個(gè)(比比如,ssecoond())。如果在在seccondd()中中發(fā)生異異常,那那么必須須做一個(gè)個(gè)檢查來來看看該該異常是是否有一一個(gè)caatchh;如果果沒有,那那么對(duì)調(diào)調(diào)用棧(first())中的下一個(gè)方法進(jìn)行檢查,然后檢查下一個(gè)(main())。如果這個(gè)異常在該調(diào)用棧上沒有被最后一個(gè)方法處理,那么就會(huì)發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤,程序終止執(zhí)行。7.4.3 finnallly語句句finaallyy語句try sttarttFauucett(); waaterrLawwn();finaallyy sttopFFauccet(); finnallly語句句定義一

10、一個(gè)總是是執(zhí)行的的代碼塊塊,而不不考慮異異常是否否被捕獲獲。下述述樣板代代碼來自自Fraank Yelllinn弗蘭克克葉林的的白皮書書Jaava中中的低級(jí)級(jí)安全:try sttarttFauucett(); waaterrLawwn();finaallyy sttopFFauccet();在前面的的例子中中,即使使異常在在打開開開關(guān)或給給草地澆澆水時(shí)發(fā)發(fā)生,開開關(guān)也能能被關(guān)掉掉。trry 后后面的括括號(hào)中的的代碼被被稱做保保護(hù)碼。如果終止止程序的的Sysstemm.exxit()方法法在保護(hù)護(hù)碼內(nèi)被被執(zhí)行,那那么,這這是fiinallly語語句不被被執(zhí)行的的唯一情情況。這這就暗示示,控制制流

11、程能能偏離正正常執(zhí)行行順序,比比如,如如果一個(gè)個(gè)retturnn語句被被嵌入ttry塊塊內(nèi)的代代碼中,那那么,ffinaallyy塊中的的代碼應(yīng)應(yīng)在reeturrn前執(zhí)執(zhí)行。7.4.4重訪訪前例下面的例例子是第第1699頁maiin()方法的的重寫。本程序序以前的的版本中中產(chǎn)生的的異常被被捕獲,數(shù)數(shù)組索引引重新設(shè)設(shè)定,使使下述程程序繼續(xù)續(xù)運(yùn)行。publlic staaticc vooid maiin (Strringg arrgs) innt ii = 0; Sttrinng ggreeetinngs = Heelloo woorldd!, Noo, II meean it!, HEELLOO

12、 WOORLDD! ; whhilee (ii 4) tryy Sysstemm.ouut.pprinntlnn (ggreeetinngsi); ccatcch (ArrrayIIndeexOuutOffBouundssExccepttionn e) Sysstemm.ouut.pprinntlnn( Re-setttinng IIndeex VValuue); i = -11; ffinaallyy Sysstemm.ouut.pprinntlnn(TThiss iss allwayys pprinntedd); i+; / eend whiile() / eend maiin() 當(dāng)循環(huán)

13、被被執(zhí)行時(shí)時(shí),下述述在屏幕幕上出現(xiàn)現(xiàn)的信息息將改變變。Helllo wworlld!Thiss iss allwayys pprinnteddNo, I mmeann itt!Thiss iss allwayys pprinnteddHELLLO WWORLLD! Thiss iss allwayys pprinnteddRe-ssetttingg Inndexx Vaaluee Thiss iss allwayys pprinntedd 第五節(jié) 異常常分類在Javva編程程語言中中,異常常有三種種分類。Javva.llangg.Thhrowwablle類充充當(dāng)所有有對(duì)象的的父類,可可以使用用

14、異常處處理機(jī)制制將這些些對(duì)象拋拋出并捕捕獲。在在Thrrowaablee類中定定義方法法來檢索索與異常常相關(guān)的的錯(cuò)誤信信息,并并打印顯顯示異常常發(fā)生的的棧跟蹤蹤信息。它有EErroor和Exccepttionn兩個(gè)基基本子類類,如下下圖所示示:Throowabble類類不能使使用,而而使用子子類異常常中的一一個(gè)來描描述任何何特殊異異常。每每個(gè)異常常的目的的描述如如下:Erroor表示示恢復(fù)不不是不可可能但很很困難的的情況下下的一種種嚴(yán)重問問題。比比如說內(nèi)內(nèi)存溢出出。不可可能指望望程序能能處理這這樣的情情況。RunttimeeExccepttionn表示一一種設(shè)計(jì)計(jì)或?qū)崿F(xiàn)現(xiàn)問題。也就是是說,它它

15、表示如如果程序序運(yùn)行正正常,從從不會(huì)發(fā)發(fā)生的情情況。比比如,如如果數(shù)組組索引擴(kuò)擴(kuò)展不超超出數(shù)組組界限,那那么,AArraayInndexxOuttOfBBounndsEExceeptiion異異常從不不會(huì)拋出出。比如如,這也也適用于于取消引引用一個(gè)個(gè)空值對(duì)對(duì)象變量量。因?yàn)闉橐粋€(gè)正正確設(shè)計(jì)計(jì)和實(shí)現(xiàn)現(xiàn)的程序序從不出出現(xiàn)這種種異常,通通常對(duì)它它不做處處理。這這會(huì)導(dǎo)致致一個(gè)運(yùn)運(yùn)行時(shí)信信息,應(yīng)應(yīng)確保能能采取措措施更正正問題,而而不是將將它藏到到誰也不不注意的的地方。其它異常常表示一一種運(yùn)行行時(shí)的困困難,它它通常由由環(huán)境效效果引起起,可以以進(jìn)行處處理。例例子包括括文件未未找到或或無效UURL異異常(用用戶

16、打了了一個(gè)錯(cuò)錯(cuò)誤的UURL),如如果用戶戶誤打了了什么東東西,兩兩者都容容易出現(xiàn)現(xiàn)。這兩兩者都可可能因?yàn)闉橛脩翦e(cuò)錯(cuò)誤而出出現(xiàn),這這就鼓勵(lì)勵(lì)程序員員去處理理它們。第六節(jié) 共同同異常共同異常常AritthmeeticcExccepttionnNulllPoiinteerExxcepptioonNegaativveArrrayySizzeExxcepptioonArraayInndexxouttofBBounndsEExceeptiionSecuurittyExxcepptioon Javva編程程語言提提供幾種種預(yù)定義義的異常常。下面面是可能能遇到的的更具共共同性的的異常中中的幾種種:Aritth

17、meeticcExccepttionn整數(shù)被被0除,運(yùn)運(yùn)算得出出的結(jié)果果。int I =12 / 00;NulllPoiinteerExxcepptioon當(dāng)對(duì)象象沒被實(shí)實(shí)例化時(shí)時(shí),訪問問對(duì)象的的屬性或或方法的的嘗試:Datee d= nuull;Systtem.outt.prrinttln(d.ttoSttrinng();NegaativveArrrayySizzeExxcepptioon創(chuàng)建帶帶負(fù)維數(shù)數(shù)大小的的數(shù)組的的嘗試。ArraayInndexxouttofBBounndsEExceeptiion訪問超超過數(shù)組組大小范范圍的一一個(gè)元素素的嘗試試。SecuurittyExxcepptio

18、on典型地地被拋出出到瀏覽覽器中,SecurityManager類將拋出applets的一個(gè)異常,該異常企圖做下述工作(除非明顯地得到允許):訪問一個(gè)個(gè)本地文文件打開主機(jī)機(jī)的一個(gè)個(gè)socckett,這個(gè)個(gè)主機(jī)與與服務(wù)于于appplett的主機(jī)機(jī)不是同同一個(gè)。在運(yùn)行時(shí)時(shí)環(huán)境中中執(zhí)行另另一個(gè)程程序第七節(jié) 處理理或聲明明規(guī)則處理或聲聲明規(guī)則則用tryy-caatchh-fiinallly塊塊來處理理異常使用thhrowws子句句聲明代代碼能引引起一個(gè)個(gè)異常為了寫出出健壯的的代碼,Java編程語言要求,當(dāng)一個(gè)方法在棧(即,它已經(jīng)被調(diào)用)上發(fā)生Exception(它與Error或RuntimeExcep

19、tion不同)時(shí),那么,該方法必須決定如果出現(xiàn)問題該采取什么措施。程序員可可以做滿滿足該要要求的兩兩件事:第一,通通過將TTrycaatchh()塊納納入其代代碼中,在在這里捕捕獲給被被命名為為屬于某某個(gè)超類類的異常常,并調(diào)調(diào)用方法法處理它它。即使使cattch塊塊是空的的,這也也算是處處理情況況。第二,讓讓被調(diào)用用的方法法表示它它將不處處理異常常,而且且該異常常將被拋拋回到它它所遇到到的調(diào)用用方法中中。它是是按如下下所示通通過用tthroows子子句標(biāo)記記的該調(diào)調(diào)用方法法的聲明明來實(shí)現(xiàn)現(xiàn)的: puubliic vvoidd trroubblessomee() thrrowss IOOExcc

20、epttionn關(guān)鍵字tthroows之之后是所所有異常常的列表表,方法法可以拋拋回到它它的調(diào)用用程序中中。盡管管這里只只顯示了了一個(gè)異異常,如如果有成成倍的可可能的異異??梢砸酝ㄟ^該該方法被被拋出,那那么,可可以使用用逗號(hào)分分開的列列表。是選擇處處理還是是選擇聲聲明一個(gè)個(gè)異常取取決于是是否給你你自己或或你的調(diào)調(diào)用程序序一個(gè)更更合適的的候選的的辦法來來處理異異常。注由于于異常類類象其它它類一樣樣被組編編到層次次中,而而且由于于無論何何時(shí)想要要使用超超類都必必須使用用子類,因此,可以捕獲異常“組”并以相同的捕獲代碼來處理它們。例如,盡管IOExceptions(EOFException,File

21、NotFoundException等等)有幾種不同的類型,通過俘獲IOException,也可以捕獲IOException任何子類的實(shí)例。第八節(jié) 創(chuàng)建建自己的的異常7.8.1介紹紹用戶定義義異常是是通過擴(kuò)擴(kuò)展Exxcepptioon類來來創(chuàng)建的的。這種種異常類類可以包包含一個(gè)個(gè)“普通”類所包包含的任任何東西西。下面面就是一一個(gè)用戶戶定義異異常類例例子,它它包含一一個(gè)構(gòu)造造函數(shù)、幾個(gè)變變量以及及方法:publlic claass SerrverrTimmedOOutEExceeptiion exttendds EExceeptiion priivatte SStriing reaasonn; p

22、riivatte iint porrt; pubblicc SeerveerTiimeddOuttExccepttionn (SStriing reaasonn,innt pportt) tthiss.reeasoon = reeasoon; tthiss.poort = pportt; pubblicc Sttrinng ggetRReasson() retturnn reeasoon; pubblicc innt ggetPPortt() rretuurn porrt; 使用語句句來拋出出已經(jīng)創(chuàng)創(chuàng)建的異異常:throow nnew SerrverrTimmedOOutEExceeptiio

23、n(Coouldd noot cconnnectt, 80);7.8.2實(shí)例例考慮一個(gè)個(gè)客戶服服務(wù)器程程序。在在客戶代代碼中,要要與服務(wù)務(wù)器連接接,并希希望服務(wù)務(wù)器在55秒鐘內(nèi)內(nèi)響應(yīng)。如果服服務(wù)器沒沒有響應(yīng)應(yīng),那么么,代碼碼就如下下所述拋拋出一個(gè)個(gè)異常(如如一個(gè)用用戶定義義的SeerveerTiimeddOuttExccepttionn)。1. pubblicc vooid connnecctMee(Sttrinng sservverNNamee) tthroows SeerveerTiimeddOuttExccepttionn int succcesss;int porrtTooConnne

24、cct = 800;succcesss = opeen(sservverNNamee, pporttToCConnnectt);if (succcesss = -1) throow nnew SerrverrTimmedOOutEExceeptiion(Couuld nott coonneect, 880);要捕獲異異常,使使用trry語句句:publlic voiid ffinddSerrverr() . . .try connnecttMe(deffaulltSeerveer); caatchh(SeerveerTiimeddOuttExccepttionn e) Systtem.outt.prrinttln(Seerveer ttimeed oout, trryinng aalteernaate);try connnecttMe(altternnateeSerrverr); caatchh (SServverTTimeedOuutEx

溫馨提示

  • 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. 人人文庫網(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)論