版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章 異常處理8.2處理異常
8.1保證程序的健壯性:異常處理
教學(xué)要求:理解:異常的分類、程序中引入異常機(jī)制的好處掌握:定義異常,使用try、catch、throw、throws和finally語(yǔ)句8.1保證程序的健壯性:異常處理異常的基本概念語(yǔ)法錯(cuò)誤:編譯時(shí)被檢測(cè)出來(lái)的錯(cuò)誤,這種錯(cuò)誤一旦產(chǎn)生并不會(huì)生成運(yùn)行代碼。運(yùn)行錯(cuò)誤:在程序運(yùn)行時(shí)代碼序列中產(chǎn)生的一種出錯(cuò)情況。這種運(yùn)行錯(cuò)誤倘若沒有及時(shí)進(jìn)行處理,可能會(huì)造成程序中斷、數(shù)據(jù)遺失乃至系統(tǒng)崩潰等問題。這種運(yùn)行錯(cuò)誤也就是我們常說(shuō)的“異常”。8.1保證程序的健壯性:異常處理(續(xù))Java的異常處理機(jī)制異常(Exception)是特殊的運(yùn)行錯(cuò)誤對(duì)象,對(duì)應(yīng)著Java語(yǔ)言特定的運(yùn)行錯(cuò)誤處理機(jī)制。發(fā)生下列情況時(shí),會(huì)出現(xiàn)異常:(1)想打開的文件不存在(2)網(wǎng)絡(luò)連接中斷(3)正在裝載的類文件丟失8.1保證程序的健壯性:異常處理(續(xù))Java中定義了很多異常類,每個(gè)異常類都代表了一種常見的運(yùn)行錯(cuò)誤,類中包含了該運(yùn)行錯(cuò)誤的信息和處理錯(cuò)誤的方法等內(nèi)容。每當(dāng)Java程序運(yùn)行過程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象。一旦一個(gè)異常對(duì)象產(chǎn)生了,就將其拋出到其調(diào)用程序中,發(fā)出已經(jīng)發(fā)生問題的信號(hào)。然后,調(diào)用方法捕獲拋出的異常,在可能時(shí),再恢復(fù)回來(lái)。8.1保證程序的健壯性:異常處理(續(xù))Java異常體系8.1保證程序的健壯性:異常處理(續(xù))Exception類是Java程序中大量處理的異常,該類又可分為兩類:從RuntimeException衍生出來(lái)的異常和衍生于Exception的其他子類的異常。RuntimeException一般是由編程錯(cuò)誤產(chǎn)生的,出現(xiàn)這類異常時(shí),程序員需調(diào)試程序避免這類異常的產(chǎn)生,該類異常一般包括錯(cuò)誤的造型、數(shù)組越界存取、空指針訪問等。8.1保證程序的健壯性:異常處理(續(xù))方法描述PublicStringgetMessage()該方法返回Exception(Stringmessage)構(gòu)造方法中,參數(shù)message所定義的字符串值。PublicStringtoString()該方法返回一條包含該類類名和指出所發(fā)生問題的描述性消息的字符串,Throwable的所有子類均繼承該方法。PublicvoidprintStackTrace()該方法沒有返回值,它的功能是完成一個(gè)打印操作,在當(dāng)前的標(biāo)準(zhǔn)輸出上打印輸出當(dāng)前例外對(duì)象的堆棧使用軌跡。Exception的常用方法:8.2處理異常程序中若不捕獲異常,將造成主方法停止執(zhí)行,由Java運(yùn)行時(shí)系統(tǒng)的默認(rèn)處理程序捕獲異常。8.2處理異常(續(xù))利用try-catch-finally語(yǔ)句處理異常:在Java語(yǔ)言中,一般情況下,為避免因程序引起的異常而使程序終止,可將需要監(jiān)視異常的代碼塊放在try塊中,當(dāng)try塊中的代碼出現(xiàn)異常時(shí),將拋出一個(gè)異常,然后將被緊接在try塊之后的catch語(yǔ)句捕獲。try{//需要監(jiān)視異常的代碼塊}catch(ExceptionType1e){//處理第一種異常}catch(ExceptionType2e){//處理第二種異常}8.2處理異常(續(xù))try-catch的執(zhí)行流程8.2處理異常(續(xù))說(shuō)明:構(gòu)造catch子句的目的是解決異常情況并且像錯(cuò)誤沒有發(fā)生一樣繼續(xù)運(yùn)行。如果方法中的某一語(yǔ)句拋出一個(gè)沒有在相應(yīng)的try-catch塊中處理的異常,那么這個(gè)異常就被拋出到調(diào)用方法中。如果異常也沒有在調(diào)用方法中被處理,它就被拋出到該方法的調(diào)用程序。這個(gè)過程要一直延續(xù)到異常被處理。如果異常到這時(shí)還沒被處理,它便回到main(),而且若main()不處理它,那么,該異常就異常地中斷程序,并且打印錯(cuò)誤堆棧軌跡。使用多重catch語(yǔ)句、嵌套try語(yǔ)句使用多重catch語(yǔ)句、嵌套try語(yǔ)句某些情況,由單個(gè)代碼段可能引起多個(gè)異常。處理這種情況,你可以定義兩個(gè)或更多的catch子句,每個(gè)子句捕獲一種類型的異常。當(dāng)你用多catch語(yǔ)句時(shí),異常子類必須在它們?nèi)魏胃割愔笆褂?。這樣,如果子類在父類后面,子類將永遠(yuǎn)不會(huì)到達(dá),而且,Java中有不能到達(dá)的代碼是一種語(yǔ)法錯(cuò)誤。各個(gè)異常都派生于同一超類。如果一個(gè)catch處理方法用于捕獲某個(gè)超類類型的異常對(duì)象,則它也可以捕獲該類的所有子類的對(duì)象。這使得用一條簡(jiǎn)潔的catch子句表達(dá)式就能處理多個(gè)相關(guān)的錯(cuò)誤,并且允許了多態(tài)性地處理這些相關(guān)的異常。8.2處理異常(續(xù))自定義異常系統(tǒng)定義的異常主要用來(lái)處理系統(tǒng)可以預(yù)見較為常見的運(yùn)行錯(cuò)誤,對(duì)于某個(gè)應(yīng)用所特有的運(yùn)行錯(cuò)誤,則需要編程人員根據(jù)程序的特殊邏輯在用戶程序里自己創(chuàng)建用戶自定義的異常類和異常對(duì)象。用戶定義異常可通過擴(kuò)展Exception類來(lái)創(chuàng)建的。這種異常類可以包含一個(gè)“普通”類所擁有的構(gòu)造函數(shù)、變量以及方法。示例8.2處理異常(續(xù))使用throw拋出異常:用戶程序自定義的異常不可能依靠系統(tǒng)自動(dòng)拋出,必須借助于throw語(yǔ)句來(lái)定義何種情況算是產(chǎn)生了此種異常對(duì)應(yīng)的錯(cuò)誤,并應(yīng)該拋出這個(gè)異常類的新對(duì)象。程序執(zhí)行在throw語(yǔ)句之后立即停止;后面的任何語(yǔ)句不被執(zhí)行。最緊緊包圍的try塊用來(lái)檢查它是否含有一個(gè)與異常類型匹配的catch語(yǔ)句。如果發(fā)現(xiàn)了匹配的塊,控制轉(zhuǎn)向該語(yǔ)句;如果沒有發(fā)現(xiàn),次包圍的try塊來(lái)檢查,以此類推。如果沒有發(fā)現(xiàn)匹配的catch塊,默認(rèn)異常處理程序中斷程序的執(zhí)行并且打印堆棧軌跡。8.2處理異常(續(xù))throw關(guān)鍵字的使用:throw語(yǔ)句的通常形式如下:throwThrowableInstance;這里,ThrowableInstance一定是Throwable類類型或Throwable子類類型的一個(gè)對(duì)象。注意:簡(jiǎn)單類型,例如int或char,以及非Throwable類,例如String或Object,不能用作異常。有兩種可以獲得Throwable對(duì)象的方法:在catch子句中使用參數(shù)或者用new操作符創(chuàng)建。8.2處理異常(續(xù))使用throws:
如果一個(gè)方法不能處理它自己所引發(fā)(throw)的代碼,我們必須用關(guān)鍵字throws聲明該方法可能引發(fā)的所有異常。主要是為了通知欲調(diào)用此方法的方法。由于該方法包含throw語(yǔ)句,所以要準(zhǔn)備接受和處理它在運(yùn)行過程中可能會(huì)拋出的異常。throws總是和方法說(shuō)明出現(xiàn)在一起的。其形式如下:typemethod-name(parameter-list)throwsexception-list
{
//bodyofmethod}exception-list是該方法可引發(fā)的的異常列表以逗號(hào)分割。8.2處理異常(續(xù))throws關(guān)鍵字的使用注意事項(xiàng):如果一個(gè)方法可以導(dǎo)致一個(gè)異常但不處理它,它必須指定這種行為以使方法的調(diào)用者可以保護(hù)它們自己而不發(fā)生異常,做到這點(diǎn)你可以在方法聲明中包含一個(gè)throws子句。一個(gè)方法可以引發(fā)的所有其他類型(除Error或RuntimeException及它們子類以外)的異常必須在throws子句中聲明。如果不這樣做,將會(huì)導(dǎo)致編譯錯(cuò)誤。8.2處理異常(續(xù))綜合實(shí)例例8-9例8-10例8-11本章小結(jié)在try塊與對(duì)應(yīng)的catch塊之間放置代碼是語(yǔ)法錯(cuò)誤。指定一個(gè)用逗號(hào)分開的catch參數(shù)列表是編譯錯(cuò)誤,catch塊只能有一個(gè)參數(shù)。與某try塊關(guān)聯(lián)的兩個(gè)不同catch子句捕獲同一類型異常是編譯錯(cuò)誤。如方法拋出了未在其throw子句中列出的受控異常,則是編譯錯(cuò)誤。如果忘記顯式地測(cè)試一個(gè)或多個(gè)子類類型,則單獨(dú)地捕獲子類的異常對(duì)象將會(huì)產(chǎn)生錯(cuò)誤;捕獲超類將確保捕獲所有的子類對(duì)象。故通常,在所有子類的catch子句后面緊跟一條超類類型的catch子句,以確保能正確地處理所有異常。本章小結(jié)(續(xù))如果方法能夠處理某個(gè)給定類型的異常,則處理該異常,而不是將該異常傳遞給程序的其他部分,這樣程序顯得比較清晰。應(yīng)避免將可能拋出異常的代碼放置在finally子句中,如果確實(shí)需要,則將這些代碼封裝在該finally子句的try-catch中。不要在每條可能拋出異常的語(yǔ)句處都放置try-catch,這樣程序難以閱讀。將一個(gè)try塊放置在代碼的重要部分,并在該try塊后放置用于處理各種可能異常的catch子句。本章小結(jié)將不需要的資源立即釋放,以提高程序的性能。盡量使用現(xiàn)有的異常類型來(lái)指出方法中的異常,而不要?jiǎng)?chuàng)建新的異常類。JavaAPI中包含了許多適合于指出方法中問題類型的異常類。如果需要定義自己的異常類型,應(yīng)研究JavaAPI中現(xiàn)有的異常類,并擴(kuò)展其中一個(gè)相關(guān)的異常類。如果程序需要處理這種異常,則這個(gè)新的異常類應(yīng)為受控異常類。如果客戶代碼能夠忽略這種異常,則這個(gè)新異常類應(yīng)該擴(kuò)展不受控類(RuntimeException)。所有異常類的類名需以Exception結(jié)束。編程練習(xí)題1.修改“實(shí)例運(yùn)用”中的第一題,自定義一個(gè)異常DevideByMinusException(除數(shù)不能為負(fù)的異常),假定該異常類為ArithmeticException的子類。2.創(chuàng)建的帳戶類,其中定義存錢、取錢、查詢余額等三個(gè)方法附加下述異常:(1)AccountOverdrawnException—當(dāng)有了這個(gè)要取出比帳戶上更多的錢的嘗試時(shí)。(2)InvalidDepositException—當(dāng)無(wú)效錢數(shù)(小于0)存入時(shí)。
編程練習(xí)題(續(xù))3.創(chuàng)建電話卡類,其中定義booleanperformConnection(longcn,intpw)方法,考慮當(dāng)連接后(即卡號(hào)、密碼相符),并希望在10秒鐘內(nèi)響應(yīng)。如果沒有響應(yīng),那么,代碼需拋出一個(gè)異常(如上文所講的ServerTimedO
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年健康產(chǎn)業(yè)投資中介合同書3篇
- 《人際關(guān)系學(xué)》課件
- 2024年北京市安全員C1證理論考試試題庫(kù)(附答案)
- 避免涉及非法金融活動(dòng)的合同
- 收費(fèi)站五一安全培訓(xùn)
- 專利設(shè)備維修合同范例
- 簡(jiǎn)易廣告制作合同范例
- 銷售營(yíng)業(yè)員聘用合同范例
- 蔬菜訂單收購(gòu)合同范例
- 環(huán)保測(cè)評(píng)合同范例
- 戲劇與美育智慧樹知到期末考試答案章節(jié)答案2024年長(zhǎng)江人民藝術(shù)劇院
- 臨床醫(yī)學(xué)概論復(fù)習(xí)資料
- TB 10012-2019 鐵路工程地質(zhì)勘察規(guī)范
- 女病人導(dǎo)尿術(shù)操作考核評(píng)分標(biāo)準(zhǔn)
- 人教版數(shù)學(xué)上冊(cè)四年級(jí)期末試卷
- 智慧水務(wù)系統(tǒng)市場(chǎng)分析及行業(yè)前景展望報(bào)告
- 小學(xué)副校長(zhǎng)教學(xué)工作總結(jié)
- 貴州省情知識(shí)考試總題庫(kù)(含答案)
- 雙方之間的合同約束
- GB/T 19923-2024城市污水再生利用工業(yè)用水水質(zhì)
- 地球科學(xué)概論(長(zhǎng)安大學(xué))智慧樹知到期末考試答案2024年
評(píng)論
0/150
提交評(píng)論