




已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章 常見(jiàn)錯(cuò)誤和異常處理,本章主要介紹編程中常見(jiàn)的錯(cuò)誤,以及在程序運(yùn)行過(guò)程中出現(xiàn)錯(cuò)誤或者異常現(xiàn)象時(shí),Java語(yǔ)言的處理機(jī)制和方法,包括異常的概念、異常的處理方法等內(nèi)容。 本章要點(diǎn) 6.1 常見(jiàn)錯(cuò)誤 6.2 異常處理 思考與練習(xí)6,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.1 什么是異常處理 異常指的是程序運(yùn)行時(shí)出現(xiàn)的非正常情況,又稱(chēng)為差錯(cuò)、違例等。在上一節(jié)中介紹的運(yùn)行錯(cuò)誤就是異常的主要現(xiàn)象。當(dāng)異?,F(xiàn)象發(fā)生時(shí),會(huì)造成程序運(yùn)行中斷、系統(tǒng)死機(jī)等問(wèn)題。Java程序可以用特定語(yǔ)句來(lái)處理異常并繼續(xù)程序執(zhí)行,而不讓程序中斷。Java語(yǔ)言提供一個(gè)異常處理類(lèi)Exception類(lèi),專(zhuān)門(mén)處理程序執(zhí)行期間的錯(cuò)誤。每當(dāng)Java程序運(yùn)行過(guò)程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類(lèi)與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類(lèi)的對(duì)象,即產(chǎn)生一個(gè)異常。Java語(yǔ)言異常處理機(jī)制有以下一些優(yōu)點(diǎn): (1)Java語(yǔ)言通過(guò)面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常事件進(jìn)行分類(lèi),體現(xiàn)了良好的層次性,提供了良好的接口,這種機(jī)制對(duì)于具有動(dòng)態(tài)運(yùn)行特性的復(fù)雜程序提供了強(qiáng)有力的控制方式。 (2)Java語(yǔ)言的異常處理機(jī)制使得處理異常的內(nèi)容和程序本身內(nèi)容分開(kāi),降低了程序的復(fù)雜性,增強(qiáng)了程序的可讀性。 (3)由于把異常事件當(dāng)成對(duì)象來(lái)處理,利用類(lèi)的層次性可以把多個(gè)具有相同父類(lèi)的異常統(tǒng)一處理,也可區(qū)分不同的異常分別處理,使用非常靈活。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.2 Exception類(lèi) Java語(yǔ)言的異常類(lèi)是處理運(yùn)行時(shí)錯(cuò)誤的特殊類(lèi),每一種異常類(lèi)對(duì)應(yīng)一種特定的運(yùn)行錯(cuò)誤。所有的Java異常類(lèi)都是系統(tǒng)類(lèi)庫(kù)中的Exception類(lèi)的子類(lèi) 。 Exception類(lèi)有若干子類(lèi),每一個(gè)子類(lèi)代表了一種特定的運(yùn)行時(shí)錯(cuò)誤。這些子類(lèi)有些是系統(tǒng)事先定義好并包含在Java類(lèi)庫(kù)中的,稱(chēng)為系統(tǒng)定義的運(yùn)行異常。 系統(tǒng)定義的運(yùn)行異常通常對(duì)應(yīng)著系統(tǒng)運(yùn)行錯(cuò)誤。由于這種錯(cuò)誤可能導(dǎo)致操作系統(tǒng)錯(cuò)誤甚至是整個(gè)系統(tǒng)的癱瘓,所以需要定義異常類(lèi)來(lái)特別處理。 常見(jiàn)的系統(tǒng)定義異常如下: (1)ArithmeticException:數(shù)學(xué)錯(cuò)誤。 (2)ArrayIndexOutOfBoundsException:數(shù)組下標(biāo)越界使用。 (3)ClassNotFoundException:未找到欲使用的類(lèi)。 (4)FileNotFoundException:未找到指定的文件或目錄。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.2 Exception類(lèi) (5)InterruptedException:線(xiàn)程在睡眠、等待或其他原因暫停時(shí)被其他線(xiàn)程打斷。 (6)IOException:輸入、輸出錯(cuò)誤。 (7)MalformedURLException:URL格式錯(cuò)誤。 (8)NullPointerException:引用空的尚無(wú)內(nèi)存空間的對(duì)象。 (9)SecurityException:安全性錯(cuò)誤,如Applet欲讀寫(xiě)文件。 (10)UnknownHostException:無(wú)法確定主機(jī)的IP地址。 系統(tǒng)定義的異常主要用來(lái)處理系統(tǒng)可以預(yù)見(jiàn)的較常見(jiàn)的運(yùn)行錯(cuò)誤,對(duì)于某個(gè)應(yīng)用程序所特有的運(yùn)行錯(cuò)誤,則需要編程者根據(jù)程序的特殊邏輯在應(yīng)用程序中自行創(chuàng)建自定義的異常類(lèi)和異常對(duì)象。這種用戶(hù)自定義異常主要用來(lái)處理用戶(hù)程序中特定的邏輯運(yùn)行錯(cuò)誤。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.3 異常處理的過(guò)程 在Java語(yǔ)言中,異常處理最常用的是try-catch-finally語(yǔ)句結(jié)構(gòu),以及throw和throws關(guān)鍵字。下面我們將一一進(jìn)行介紹。 1try-catch-finally 通過(guò)使用try-catch-finally語(yǔ)句來(lái)捕獲一個(gè)或多個(gè)異常,基本格式為: try 語(yǔ)句體 catch( 異常錯(cuò)誤類(lèi)型 變量名 ) 語(yǔ)句體 finally 語(yǔ)句體 ,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.3 異常處理的過(guò)程 其中,catch語(yǔ)句可以有一個(gè)或多個(gè),而finally語(yǔ)句可以沒(méi)有,但是,至少要有一個(gè)catch語(yǔ)句或finally語(yǔ)句。 try語(yǔ)句中的語(yǔ)句體是程序中有可能會(huì)產(chǎn)生一個(gè)或多個(gè)異常的語(yǔ)句。 catch語(yǔ)句的參數(shù)類(lèi)似于方法的參數(shù),其包括一個(gè)異常類(lèi)型和一個(gè)異常對(duì)象。異常類(lèi)型必須為Exception類(lèi)的子類(lèi),它指明了catch語(yǔ)句所處理的異常類(lèi)型。在程序運(yùn)行時(shí),當(dāng)try語(yǔ)句體中產(chǎn)生異常時(shí),系統(tǒng)會(huì)通過(guò)catch語(yǔ)句捕獲這個(gè)異常,然后執(zhí)行catch語(yǔ)句中的語(yǔ)句體對(duì)該異常進(jìn)行處理。 catch語(yǔ)句可以有多個(gè),分別處理不同類(lèi)的異常。Java運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的異常類(lèi)型進(jìn)行檢測(cè),直到找到類(lèi)型相匹配的catch語(yǔ)句為止。這里,類(lèi)型匹配指catch所處理的異常類(lèi)型與生成的異常對(duì)象的類(lèi)型完全一致或者是它的父類(lèi)。因此,catch語(yǔ)句的排列順序應(yīng)該是從特殊到一般。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.3 異常處理的過(guò)程 也可以用一個(gè)catch語(yǔ)句處理多個(gè)異常類(lèi)型,這時(shí)它的異常類(lèi)型參數(shù)應(yīng)該是這多個(gè)異常類(lèi)型的父類(lèi),程序設(shè)計(jì)中要根據(jù)具體的情況來(lái)選擇catch語(yǔ)句的異常處理類(lèi)型。 在捕捉異常時(shí),還可以使用finally語(yǔ)句。在try-catch之后接上finally語(yǔ)句,表示執(zhí)行try-catch描述后,無(wú)論有無(wú)異常,最后必須執(zhí)行finally語(yǔ)句中的語(yǔ)句體。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.3 異常處理的過(guò)程 2關(guān)鍵字throws和throw 在有些情況下,程序并不需要使用try-catch-finally處理它所生成的異常,而是由調(diào)用它的方法來(lái)處理這些異常,這時(shí)就要用到throws子句,它包含在方法的聲明中。其格式如下: 返回類(lèi)型 方法名( 參數(shù) ) throws 異常類(lèi)名 語(yǔ)句體 其中,異常類(lèi)名可以是多個(gè),但需要用逗號(hào)隔開(kāi)。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.3 異常處理的過(guò)程 2關(guān)鍵字throws和throw 一般這種拋出異常的語(yǔ)句應(yīng)該被定義為在滿(mǎn)足一定條件時(shí)執(zhí)行,例如:把throw語(yǔ)句放在if語(yǔ)句的判斷分支中,只有當(dāng)if條件得到滿(mǎn)足,即用戶(hù)定義的邏輯錯(cuò)誤發(fā)生時(shí)才執(zhí)行。 含有throw語(yǔ)句的方法,應(yīng)該在方法頭定義中增加如下部分: throws 異常類(lèi)名 這樣做主要是為了通知所有欲調(diào)用此方法的方法。由于該方法包含throw語(yǔ)句,所以要準(zhǔn)備接受和處理它在運(yùn)行過(guò)程中可能會(huì)拋出的異常。如果方法中的throw語(yǔ)句不止一個(gè),定義方法時(shí)的異常類(lèi)名也不止一個(gè),應(yīng)該包含所有可能產(chǎn)生的異常。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.4 多異常的處理 catch語(yǔ)句用來(lái)接收try語(yǔ)句體中可能產(chǎn)生的異常,一個(gè)catch語(yǔ)句通常會(huì)用同種方式來(lái)處理它所接收到的所有異常,但是實(shí)際上一個(gè)try語(yǔ)句體可能產(chǎn)生多種不同的異常,如果希望能采取不同的方法來(lái)處理這些異常,就需要使用多異常處理機(jī)制。 多異常處理是通過(guò)在一個(gè)try語(yǔ)句后面定義若干個(gè)catch語(yǔ)句來(lái)實(shí)現(xiàn)的,每個(gè)catch語(yǔ)句體用來(lái)接收和處理一種特定的異常對(duì)象。 當(dāng)try語(yǔ)句體拋出一個(gè)異常時(shí),程序的流程首先轉(zhuǎn)向第一個(gè)catch語(yǔ)句,并審查當(dāng)前異常對(duì)象可否為這個(gè)catch語(yǔ)句所接收。能接收是指異常對(duì)象與catch的參數(shù)類(lèi)型相匹配,也就是說(shuō),異常對(duì)象與參數(shù)屬于相同的異常類(lèi)、異常對(duì)象屬于參數(shù)異常類(lèi)的子類(lèi)或者異常對(duì)象實(shí)現(xiàn)了參數(shù)所定義的接口。 如果try語(yǔ)句體產(chǎn)生的異常對(duì)象被第一個(gè)catch語(yǔ)句所接收,則程序的流程將直接跳轉(zhuǎn)到這個(gè)catch語(yǔ)句的語(yǔ)句體中,語(yǔ)句體執(zhí)行完畢后就退出當(dāng)前方法,try語(yǔ)句體中尚未執(zhí)行的語(yǔ)句和其他的catch語(yǔ)句將被忽略。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.4 多異常的處理 如果所有的catch語(yǔ)句都不能與當(dāng)前的異常對(duì)象匹配,則說(shuō)明當(dāng)前方法不能處理這個(gè)異常對(duì)象,程序流程將返回到調(diào)用該方法的上層方法。如果這個(gè)上層方法中定義了與所產(chǎn)生的異常對(duì)象相匹配的catch語(yǔ)句,流程就跳轉(zhuǎn)到這個(gè)catch語(yǔ)句中,否則將繼續(xù)回溯更上層的方法。 如果所有的方法中都找不到合適的catch語(yǔ)句,則由Java運(yùn)行系統(tǒng)來(lái)處理這個(gè)異常對(duì)象。此時(shí)通常會(huì)中止程序的執(zhí)行,退出虛擬機(jī)返回操作系統(tǒng),并在標(biāo)準(zhǔn)輸出上打印相關(guān)的異常信息。 如果try語(yǔ)句體中所有語(yǔ)句的執(zhí)行都沒(méi)有引發(fā)異常,則所有的catch語(yǔ)句體都會(huì)被忽略而不予執(zhí)行。 catch語(yǔ)句體中的語(yǔ)句應(yīng)根據(jù)異常的不同而執(zhí)行不同的操作,比較通用的操作是打印異常和錯(cuò)誤的相關(guān)信息,包括異常名稱(chēng)、產(chǎn)生異常的方法名等。 由于異常對(duì)象與catch語(yǔ)句的匹配是按照catch語(yǔ)句的先后排列順序進(jìn)行的,所以在處理多異常時(shí)應(yīng)注意認(rèn)真設(shè)計(jì)各catch語(yǔ)句的排列順序。一般來(lái)說(shuō),將處理較具體和較常見(jiàn)的異常的catch語(yǔ)句應(yīng)放在前面,而可以與多種異常相匹配的catch語(yǔ)句應(yīng)放在較后的位置。此外,不能將子類(lèi)異常的catch語(yǔ)句放在父類(lèi)的后面,否則在編譯時(shí)會(huì)產(chǎn)生錯(cuò)誤。,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.5 自定義異常處理 Java類(lèi)庫(kù)中定義的異常主要用來(lái)處理系統(tǒng)可以預(yù)見(jiàn)的比較常見(jiàn)的運(yùn)行錯(cuò)誤。如果某個(gè)應(yīng)用程序有特殊的要求,則可能出現(xiàn)系統(tǒng)不能識(shí)別的運(yùn)行錯(cuò)誤,這時(shí)就需要用戶(hù)自己創(chuàng)建異常和異常類(lèi),使系統(tǒng)能夠識(shí)別這種錯(cuò)誤并進(jìn)行處理,增強(qiáng)用戶(hù)程序的健壯性和容錯(cuò)性,從而使系統(tǒng)更加穩(wěn)定。 用戶(hù)自定義的異常類(lèi)一般都是Exception類(lèi)的直接或間接子類(lèi)。 創(chuàng)建自定義異常的基本步驟如下。 (1)定義一個(gè)新的異常類(lèi),其必須繼承Exception類(lèi)、Exception類(lèi)的子類(lèi)或用戶(hù)自定義的其他異常類(lèi)。定義的格式如下: class 自定義異常類(lèi)名 extends 父異常類(lèi)名 語(yǔ)句體 ,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.5 自定義異常處理 (2)為新的異常類(lèi)定義屬性和方法,或重載父類(lèi)的屬性和方法,使之能夠體現(xiàn)出程序中出現(xiàn)這種異常的信息。 例如: public class NumberRangeException extends Exception public NumberRangeException() super(); public NumberRangeException( String s ) super( s ); ,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.5 自定義異常處理 上面的程序定義了一個(gè)名為NumberRangeException的異常類(lèi),它是Exception類(lèi)的子類(lèi)。該類(lèi)具有兩個(gè)構(gòu)造方法,第一個(gè)構(gòu)造方法使用super();語(yǔ)句直接調(diào)用父類(lèi)的沒(méi)有參數(shù)的構(gòu)造方法,第二個(gè)構(gòu)造方法使用super( s );語(yǔ)句直接調(diào)用父類(lèi)參數(shù)為字符串類(lèi)型的構(gòu)造方法。 當(dāng)然,我們也可以自己編寫(xiě)構(gòu)造方法的具體內(nèi)容,以便完成更復(fù)雜的操作。 (3)拋出用戶(hù)自定義的異常。用戶(hù)自定義異常不可能依靠系統(tǒng)自動(dòng)拋出,而必須通過(guò)throw語(yǔ)句拋出異常,通常是通過(guò)條件判斷確定是否拋出這個(gè)異常類(lèi)的新對(duì)象。 拋出用戶(hù)自定義異常格式如下: 返回類(lèi)型 方法名( 參數(shù)1, 參數(shù)2, ) throw 自定義異常類(lèi) if( 條件判斷 ) throw ( new 自定義異常類(lèi)名( this ) ); ,第6章 常見(jiàn)錯(cuò)誤和異常處理,6.2.5 自定義異常處理 上面的程序定義了一個(gè)名為NumberRangeException的異常類(lèi),它是Exception類(lèi)的子類(lèi)。該類(lèi)具有兩個(gè)構(gòu)造方法,第一個(gè)構(gòu)造方法使用super();語(yǔ)句直接調(diào)用父類(lèi)的沒(méi)有參數(shù)的構(gòu)造方法,第
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)綜合體儲(chǔ)藏室所有權(quán)轉(zhuǎn)移協(xié)議
- 民營(yíng)企業(yè)廠房租賃安全生產(chǎn)協(xié)議范本
- 涉及租賃房屋周邊商業(yè)配套的退房協(xié)議
- 房屋委托租房協(xié)議書(shū)范本
- 農(nóng)產(chǎn)品集中采購(gòu)合作協(xié)議
- 無(wú)人振搗機(jī)軌跡規(guī)劃
- 下肢深靜脈血栓治療與護(hù)理
- 2024年高考語(yǔ)文復(fù)習(xí):宮苑類(lèi)題材古代詩(shī)歌閱讀練習(xí)題(含答案解析)
- 制造客戶(hù)需求培訓(xùn)
- 四有好老師教師培訓(xùn)講座
- 《統(tǒng)計(jì)學(xué)》 課件 廖穎文 1. 緒 論
- QCC品管圈活動(dòng)表格匯編
- 幼兒園零星改造工程施工完整方案
- 城市軌道交通服務(wù)禮儀PPT完整全套教學(xué)課件
- 第四講 堅(jiān)持以人民為中心PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 《世界遺產(chǎn)背景下的影響評(píng)估指南和工具包》
- DolphinScheduler體系架構(gòu)突破
- 探究食育課程對(duì)小班幼兒良好飲食習(xí)慣形成的作用 論文
- 電力安全規(guī)程(變電)
- 南通鋼筋加工裝備項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論