![scjp培訓(xùn)第七章java異常_第1頁](http://file4.renrendoc.com/view/31f70c72d1bcfe1834ddb801a0df9fb9/31f70c72d1bcfe1834ddb801a0df9fb91.gif)
![scjp培訓(xùn)第七章java異常_第2頁](http://file4.renrendoc.com/view/31f70c72d1bcfe1834ddb801a0df9fb9/31f70c72d1bcfe1834ddb801a0df9fb92.gif)
![scjp培訓(xùn)第七章java異常_第3頁](http://file4.renrendoc.com/view/31f70c72d1bcfe1834ddb801a0df9fb9/31f70c72d1bcfe1834ddb801a0df9fb93.gif)
![scjp培訓(xùn)第七章java異常_第4頁](http://file4.renrendoc.com/view/31f70c72d1bcfe1834ddb801a0df9fb9/31f70c72d1bcfe1834ddb801a0df9fb94.gif)
![scjp培訓(xùn)第七章java異常_第5頁](http://file4.renrendoc.com/view/31f70c72d1bcfe1834ddb801a0df9fb9/31f70c72d1bcfe1834ddb801a0df9fb95.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE104/NUMPAGES9第七章異常本模塊講述建立在Java編程語言中的錯誤處理裝置。第一節(jié)相關(guān)問題討論—下述問題及本模塊中的材料相關(guān):在大部分編程語言中,如何解決運(yùn)行時錯誤?第二節(jié)目的本模塊學(xué)習(xí)結(jié)束后,能夠:定義異常使用try,catch和finally語句描述異常分類開發(fā)程序來處理自己的異常第三節(jié)異常異常異常類定義程序所遇到的輕微錯誤發(fā)生下列情況時,會出現(xiàn)異常:想打開的文件不存在網(wǎng)絡(luò)連接中斷受控操作數(shù)超出預(yù)定范圍非常感興趣地正在裝載的類文件丟失錯誤類定義嚴(yán)重的錯誤條件7.3.1介紹什么是異常?在Java編程語言中,異常類定義程序中可能遇到的輕微的錯誤條件??梢詫懘a來處理異常并繼續(xù)程序執(zhí)行,而不是讓程序中斷。在程序執(zhí)行中,任何中斷正常程序流程的異常條件就是錯誤或異常。例如,發(fā)生下列情況時,會出現(xiàn)異常:想打開的文件不存在網(wǎng)絡(luò)連接中斷受控操作數(shù)超出預(yù)定范圍非常感興趣地正在裝載的類文件丟失在Java編程語言中,錯誤類定義被認(rèn)為是不能恢復(fù)的嚴(yán)重錯誤條件。在大多數(shù)情況下,當(dāng)遇到這樣的錯誤時,建議讓程序中斷。Java編程語言實(shí)現(xiàn)C++異常來幫助建立彈性代碼。在程序中發(fā)生錯誤時,發(fā)現(xiàn)錯誤的方法能拋出一個異常到其調(diào)用程序,發(fā)出已經(jīng)發(fā)生問題的信號。然后,調(diào)用方法捕獲拋出的異常,在可能時,再恢復(fù)回來。這個方案給程序員一個寫處理程序的選擇,來處理異常。通過瀏覽API,可以決定方法拋出的是什么樣的異常。7.3.2實(shí)例考慮一下HelloWorld.java程序版本的簡單擴(kuò)展,它通過信息來循環(huán):publicclassHelloWorld{publicstaticvoidmain(Stringargs[]){inti=0;Stringgreetings[]={"Helloworld!","No,Imeanit!","HELLOWORLD!!"};while(i<4){System.out.println(greetings[i]);i++;}}}正常情況下,當(dāng)異常被拋出時,在其循環(huán)被執(zhí)行四次之后,程序終止,并帶有錯誤信息,就象前面所示的程序那樣。c:\student\>javaHelloWorldHelloworld!No,Imeanit!HELLOWORLD!!java.lang.ArrayIndexOutOfBoundsException:3atHelloWorld.main(HelloWorld.java:12)異常處理允許程序捕獲異常,處理它們,然后繼續(xù)程序執(zhí)行。它是分層把關(guān),因此,錯誤情況不會介入到程序的正常流程中。特殊情況發(fā)生時,在及正常執(zhí)行的代碼分離的代碼塊中被處理。這就產(chǎn)生了更易識別和管理的代碼。第四節(jié)異常處理Java編程語言提供了一個來考慮哪個異常被拋出以及如何來恢復(fù)它的機(jī)制。7.4.1try和catch語句try和catch語句try{//codethatmightthrowaparticularexception}catch(MyExceptionTypee){//codetoexecuteifaMyExceptionTypeexceptionisthrown}catch(Exceptione){//codetoexecuteifageneralExceptionexceptionisthrown}要處理特殊的異常,將能夠拋出異常的代碼放入try塊中,然后創(chuàng)建相應(yīng)的catch塊的列表,每個可以被拋出異常都有一個。如果生成的異常及catch中提到的相匹配,那么catch條件的塊語句就被執(zhí)行。在try塊之后,可能有許多catch塊,每一個都處理不同的異常。1.try{2.//codethatmightthrowaparticularexception3.}catch(MyExceptionTypee){4.//codetoexecuteifaMyExceptionTypeexceptionisthrown5.}catch(Exceptione){6.//codetoexecuteifageneralExceptionexceptionisthrown7.}7.4.2調(diào)用棧機(jī)制如果方法中的一個語句拋出一個沒有在相應(yīng)的try/catch塊中處理的異常,那么這個異常就被拋出到調(diào)用方法中。如果異常也沒有在調(diào)用方法中被處理,它就被拋出到該方法的調(diào)用程序。這個過程要一直延續(xù)到異常被處理。如果異常到這時還沒被處理,它便回到main(),而且,即使main()不處理它,那么,該異常就異常地中斷程序??紤]這樣一種情況,在該情況中main()方法調(diào)用另一個方法(比如,first()),然后它調(diào)用另一個(比如,second())。如果在second()中發(fā)生異常,那么必須做一個檢查來看看該異常是否有一個catch;如果沒有,那么對調(diào)用棧(first())中的下一個方法進(jìn)行檢查,然后檢查下一個(main())。如果這個異常在該調(diào)用棧上沒有被最后一個方法處理,那么就會發(fā)生一個運(yùn)行時錯誤,程序終止執(zhí)行。7.4.3finally語句finally語句try{startFaucet();waterLawn();}finally{stopFaucet();}finally語句定義一個總是執(zhí)行的代碼塊,而不考慮異常是否被捕獲。下述樣板代碼來自FrankYellin弗蘭克葉林的白皮書《Java中的低級安全》:try{startFaucet();waterLawn();}finally{stopFaucet();}在前面的例子中,即使異常在打開開關(guān)或給草地澆水時發(fā)生,開關(guān)也能被關(guān)掉。try后面的括號中的代碼被稱做保護(hù)碼。如果終止程序的System.exit()方法在保護(hù)碼內(nèi)被執(zhí)行,那么,這是finally語句不被執(zhí)行的唯一情況。這就暗示,控制流程能偏離正常執(zhí)行順序,比如,如果一個return語句被嵌入try塊內(nèi)的代碼中,那么,finally塊中的代碼應(yīng)在return前執(zhí)行。7.4.4重訪前例下面的例子是第169頁main()方法的重寫。本程序以前的版本中產(chǎn)生的異常被捕獲,數(shù)組索引重新設(shè)定,使下述程序繼續(xù)運(yùn)行。publicstaticvoidmain(Stringargs[]){inti=0;Stringgreetings[]={"Helloworld!","No,Imeanit!","HELLOWORLD!!"};while(i<4){try{System.out.println(greetings[i]);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Re-settingIndexValue");i=-1;}finally{System.out.println("Thisisalwaysprinted");}i++;}//endwhile()}//endmain()當(dāng)循環(huán)被執(zhí)行時,下述在屏幕上出現(xiàn)的信息將改變。Helloworld!ThisisalwaysprintedNo,Imeanit!ThisisalwaysprintedHELLOWORLD!!ThisisalwaysprintedRe-settingIndexValueThisisalwaysprinted第五節(jié)異常分類在Java編程語言中,異常有三種分類。Java.lang.Throwable類充當(dāng)所有對象的父類,可以使用異常處理機(jī)制將這些對象拋出并捕獲。在Throwable類中定義方法來檢索及異常相關(guān)的錯誤信息,并打印顯示異常發(fā)生的棧跟蹤信息。它有Error和Exception兩個基本子類,如下圖所示:Throwable類不能使用,而使用子類異常中的一個來描述任何特殊異常。每個異常的目的描述如下:Error表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。RuntimeException表示一種設(shè)計(jì)或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運(yùn)行正常,從不會發(fā)生的情況。比如,如果數(shù)組索引擴(kuò)展不超出數(shù)組界限,那么,ArrayIndexOutOfBoundsException異常從不會拋出。比如,這也適用于取消引用一個空值對象變量。因?yàn)橐粋€正確設(shè)計(jì)和實(shí)現(xiàn)的程序從不出現(xiàn)這種異常,通常對它不做處理。這會導(dǎo)致一個運(yùn)行時信息,應(yīng)確保能采取措施更正問題,而不是將它藏到誰也不注意的地方。其它異常表示一種運(yùn)行時的困難,它通常由環(huán)境效果引起,可以進(jìn)行處理。例子包括文件未找到或無效URL異常(用戶打了一個錯誤的URL),如果用戶誤打了什么東西,兩者都容易出現(xiàn)。這兩者都可能因?yàn)橛脩翦e誤而出現(xiàn),這就鼓勵程序員去處理它們。第六節(jié)共同異常共同異常ArithmeticExceptionNullPointerExceptionNegativeArraySizeExceptionArrayIndexoutofBoundsExceptionSecurityExceptionJava編程語言提供幾種預(yù)定義的異常。下面是可能遇到的更具共同性的異常中的幾種:ArithmeticException—整數(shù)被0除,運(yùn)算得出的結(jié)果。intI=12/0;NullPointerException—當(dāng)對象沒被實(shí)例化時,訪問對象的屬性或方法的嘗試:Dated=null;System.out.println(d.toString());NegativeArraySizeException—創(chuàng)建帶負(fù)維數(shù)大小的數(shù)組的嘗試。ArrayIndexoutofBoundsException—訪問超過數(shù)組大小范圍的一個元素的嘗試。SecurityException—典型地被拋出到瀏覽器中,SecurityManager類將拋出applets的一個異常,該異常企圖做下述工作(除非明顯地得到允許):訪問一個本地文件打開主機(jī)的一個socket,這個主機(jī)及服務(wù)于applet的主機(jī)不是同一個。在運(yùn)行時環(huán)境中執(zhí)行另一個程序第七節(jié)處理或聲明規(guī)則處理或聲明規(guī)則用try-catch-finally塊來處理異常使用throws子句聲明代碼能引起一個異常為了寫出健壯的代碼,Java編程語言要求,當(dāng)一個方法在棧(即,它已經(jīng)被調(diào)用)上發(fā)生Exception(它及Error或RuntimeException不同)時,那么,該方法必須決定如果出現(xiàn)問題該采取什么措施。程序員可以做滿足該要求的兩件事:第一,通過將Try{}catch(){}塊納入其代碼中,在這里捕獲給被命名為屬于某個超類的異常,并調(diào)用方法處理它。即使catch塊是空的,這也算是處理情況。第二,讓被調(diào)用的方法表示它將不處理異常,而且該異常將被拋回到它所遇到的調(diào)用方法中。它是按如下所示通過用throws子句標(biāo)記的該調(diào)用方法的聲明來實(shí)現(xiàn)的:publicvoidtroublesome()throwsIOException關(guān)鍵字throws之后是所有異常的列表,方法可以拋回到它的調(diào)用程序中。盡管這里只顯示了一個異常,如果有成倍的可能的異??梢酝ㄟ^該方法被拋出,那么,可以使用逗號分開的列表。是選擇處理還是選擇聲明一個異常取決于是否給你自己或你的調(diào)用程序一個更合適的候選的辦法來處理異常。注—由于異常類象其它類一樣被組編到層次中,而且由于無論何時想要使用超類都必須使用子類,因此,可以捕獲異?!敖M”并以相同的捕獲代碼來處理它們。例如,盡管IOExceptions(EOFException,等等)有幾種不同的類型,通過俘獲IOException,也可以捕獲IOException任何子類的實(shí)例。第八節(jié)創(chuàng)建自己的異常7.8.1介紹用戶定義異常是通過擴(kuò)展Exception類來創(chuàng)建的。這種異常類可以包含一個“普通”類所包含的任何東西。下面就是一個用戶定義異常類例子,它包含一個構(gòu)造函數(shù)、幾個變量以及方法:publicclassServerTimedOutExceptionextendsException{privateStringreason;privateintport;publicServerTimedOutException(Stringreason,intport){this.reason=reason;this.port=port;}publicStringgetReason(){returnreason;}publicintgetPort(){returnport;}}使用語句來拋出已經(jīng)創(chuàng)建的異常:thrownewServerTimedOutException("Couldnotconnect",80);7.8.2實(shí)例考慮一個客戶服務(wù)器程序。在客戶代碼中,要及服務(wù)器連接,并希望服務(wù)器在5秒鐘內(nèi)響應(yīng)。如果服務(wù)器沒有響應(yīng),那么,代碼就如下所述拋出一個異常(如一個用戶定義的ServerTimedOutException)。1.publicvoidconnectMe(StringserverName)throwsServerTimedOutException{intsuccess;intportToConnect=80;success=open(serverName,portToConnect);if(success==-1){thrownewServerTimedOutException("Couldnotconnect",80);}}要捕獲異常,使用try語句:publicvoidfindServer(){...try{connectMe(defaultServer);}catch(ServerTimedOutExceptione){System.out.println("Servertimedout,tryingalternate");try{connectMe(alternateServer);}catch(ServerTimedOutExceptione1){System.out.println("Noservercurrentlyavailable");}}.../
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告公司合作合同范本6篇
- 2025年云南省職教高考《語文》考前沖刺模擬試題庫(附答案)
- 2025年武漢外語外事職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年日照職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年撫順師范高等??茖W(xué)校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 專題06 明清時期:統(tǒng)一多民族國家的鞏固與發(fā)展(講義)
- 小賣部承包經(jīng)營合同
- 黃豆采購合同
- 買賣合同的補(bǔ)充協(xié)議書
- 簡單的崗位聘用合同范本
- 成品移動公廁施工方案
- 2025年度部隊(duì)食堂食材采購與質(zhì)量追溯服務(wù)合同3篇
- 新人教版一年級下冊數(shù)學(xué)教案集體備課
- 任務(wù)型閱讀 -2024年浙江中考英語試題專項(xiàng)復(fù)習(xí)(解析版)
- 繪本 課件教學(xué)課件
- 大型央國企信創(chuàng)化與數(shù)字化轉(zhuǎn)型規(guī)劃實(shí)施方案
- pcn培訓(xùn)培訓(xùn)課件
- 過錯方財產(chǎn)自愿轉(zhuǎn)讓協(xié)議書(2篇)
- 監(jiān)理專題安全例會紀(jì)要(3篇)
- 牧場物語-礦石鎮(zhèn)的伙伴們-完全攻略
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理體系 審核與認(rèn)證機(jī)構(gòu)要求》中文版(機(jī)翻)
評論
0/150
提交評論