異常處理 ppt課件_第1頁(yè)
異常處理 ppt課件_第2頁(yè)
異常處理 ppt課件_第3頁(yè)
異常處理 ppt課件_第4頁(yè)
異常處理 ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩62頁(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)介

1、第八章第八章 異常處置異常處置Exception)8.1 異常分類異常分類8.2 引發(fā)異常引發(fā)異常8.3 聲明拋出異常聲明拋出異常8.4 捕捉異常捕捉異常8.5 定義本人的異常類型定義本人的異常類型8.6 構(gòu)造方法與異常處置構(gòu)造方法與異常處置8.7 小結(jié)小結(jié) try-catch-finally語(yǔ)句語(yǔ)句 ,其語(yǔ)法格式:其語(yǔ)法格式: try /能夠發(fā)生異常的代碼能夠發(fā)生異常的代碼 catch異常類型異常類型1 變量變量 /異常的處置代碼異常的處置代碼 catch異常類型異常類型2 變量變量 /異常的處置代碼異常的處置代碼 . finally /總是要執(zhí)行的代碼總是要執(zhí)行的代碼 產(chǎn)生異常語(yǔ)句thro

2、w拋出異常異常類構(gòu)造異常的方法finally機(jī)制異常異常(例外例外) 是方法代碼運(yùn)轉(zhuǎn)時(shí)出現(xiàn)的非正常形狀,這種是方法代碼運(yùn)轉(zhuǎn)時(shí)出現(xiàn)的非正常形狀,這種非正常形狀使程序無(wú)法或不能再正常地繼續(xù)往非正常形狀使程序無(wú)法或不能再正常地繼續(xù)往下運(yùn)轉(zhuǎn)。下運(yùn)轉(zhuǎn)。常見(jiàn)的異常:常見(jiàn)的異常: 數(shù)組下標(biāo)越界數(shù)組下標(biāo)越界 除數(shù)為零除數(shù)為零 內(nèi)存溢出內(nèi)存溢出 文件找不到等。文件找不到等。 運(yùn)轉(zhuǎn)機(jī)制:運(yùn)轉(zhuǎn)機(jī)制: 當(dāng)一個(gè)方法在運(yùn)轉(zhuǎn)時(shí)發(fā)生異常時(shí),將產(chǎn)當(dāng)一個(gè)方法在運(yùn)轉(zhuǎn)時(shí)發(fā)生異常時(shí),將產(chǎn)生相應(yīng)類型的一個(gè)異常對(duì)象、中止代碼繼生相應(yīng)類型的一個(gè)異常對(duì)象、中止代碼繼續(xù)往下運(yùn)轉(zhuǎn)并尋覓相應(yīng)的異常處置代碼。續(xù)往下運(yùn)轉(zhuǎn)并尋覓相應(yīng)的異常處置代碼。異常處

3、置:異常處置:1 判別異常類型判別異常類型2 產(chǎn)生對(duì)象產(chǎn)生對(duì)象3 捕獲處置異常捕獲處置異常 異常對(duì)象記錄著這個(gè)異常的一些描畫(huà)和異常對(duì)象記錄著這個(gè)異常的一些描畫(huà)和形狀信息。形狀信息。 方法運(yùn)轉(zhuǎn)失敗時(shí),記錄這個(gè)異常信息的方法運(yùn)轉(zhuǎn)失敗時(shí),記錄這個(gè)異常信息的異常對(duì)象將產(chǎn)生或稱為引發(fā),拋出,異常對(duì)象將產(chǎn)生或稱為引發(fā),拋出,throw,它有兩種引發(fā)方式:,它有兩種引發(fā)方式: 1 系統(tǒng)自動(dòng)引發(fā)系統(tǒng)自動(dòng)引發(fā) 2 在程序中由在程序中由throw語(yǔ)句引發(fā)語(yǔ)句引發(fā) 異常對(duì)象引發(fā)后,系統(tǒng)根據(jù)異常對(duì)象的異常對(duì)象引發(fā)后,系統(tǒng)根據(jù)異常對(duì)象的類型,首先在當(dāng)前方法尋覓相應(yīng)的異常處置類型,首先在當(dāng)前方法尋覓相應(yīng)的異常處置代碼,找

4、到后就將控制流轉(zhuǎn)入該異常處置代代碼,找到后就將控制流轉(zhuǎn)入該異常處置代碼并向其傳送異常對(duì)象稱為捕獲該異常,碼并向其傳送異常對(duì)象稱為捕獲該異常,catch,異常處置代碼可以根據(jù)接遭到的,異常處置代碼可以根據(jù)接遭到的異常對(duì)象進(jìn)展相應(yīng)的處置;異常對(duì)象進(jìn)展相應(yīng)的處置;尋覓相應(yīng)的異常處置代碼的過(guò)程:尋覓相應(yīng)的異常處置代碼的過(guò)程:當(dāng)前方法當(dāng)前方法直接或間接調(diào)用者直接或間接調(diào)用者找到,傳送異常對(duì)象并進(jìn)展異常處置找到,傳送異常對(duì)象并進(jìn)展異常處置沒(méi)有找到,調(diào)用默許的異常處置程序,沒(méi)有找到,調(diào)用默許的異常處置程序,中止當(dāng)前線程中止當(dāng)前線程 舉例沒(méi)有異常處置的情況舉例沒(méi)有異常處置的情況1) class Excepti

5、onDivideBy0 2) static void method() int x = 0, z=10; int y = 10 / x; System.out.println(z=+z);public static void main(String args) method(); System.out.println(After method.); 11) Exception in thread main java.lang.ArithmeticException: / by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4

6、) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)Press any key to continue.具有異常處置的情況具有異常處置的情況class ExceptionDivideBy0 static void method() int x = 0,z=10; try int y = 10 / x; System.out.println(z=+z); catch(ArithmeticException e) System.out.println(ArithmeticException); System.out.println(Afte

7、r try/catch blocks.); public static void main(String args) method(); System.out.println(After method.); ArithmeticExceptionAfter try/catch blocks.After method.每個(gè)異常由類每個(gè)異常由類Throwable或者它的一個(gè)子類的實(shí)例表或者它的一個(gè)子類的實(shí)例表示,這樣的對(duì)象可被拋出并能被傳送給適宜的異常示,這樣的對(duì)象可被拋出并能被傳送給適宜的異常處置代碼處置。處置代碼處置。Throwable類及其子類統(tǒng)稱為異常類,類及其子類統(tǒng)稱為異常類,每個(gè)異常類

8、表示一種異常類型。每個(gè)異常類表示一種異常類型。Throwable類是類是Object類的直接子類,其本身又有兩類的直接子類,其本身又有兩個(gè)直接子類:個(gè)直接子類: Error與與Exception類。類。RuntimeException類是類是Exception類的直接子類,如類的直接子類,如圖圖8-1所示。這里,所示。這里, Error類、類、RuntimeException類類和和Exception類分別代表某一類異常類型:類分別代表某一類異常類型:8.1 異常分類異常分類圖圖8-1 異常類型及其分類異常類型及其分類(1) Error類及其子類:類及其子類: 表示災(zāi)難性的、普通程序很表示災(zāi)難

9、性的、普通程序很難恢復(fù)的異常,例如:難恢復(fù)的異常,例如: NoClassDefFoundError類定義沒(méi)找到異常:類定義沒(méi)找到異常: JVM無(wú)法找到相應(yīng)的無(wú)法找到相應(yīng)的class文件。文件。 OutOfMemoryError內(nèi)存越界異常:內(nèi)存越界異常: JVM沒(méi)沒(méi)有足夠的存儲(chǔ)空間滿足對(duì)象創(chuàng)建的要求。有足夠的存儲(chǔ)空間滿足對(duì)象創(chuàng)建的要求。 NoSuchMethodError調(diào)用不存在的方法異常:調(diào)用不存在的方法異常: 在改動(dòng)某個(gè)方法的簽名后,原先要調(diào)用該方法的運(yùn)在改動(dòng)某個(gè)方法的簽名后,原先要調(diào)用該方法的運(yùn)用程序,在運(yùn)轉(zhuǎn)時(shí)就會(huì)拋出該異常。用程序,在運(yùn)轉(zhuǎn)時(shí)就會(huì)拋出該異常。 普通情況下,程序員可不用理

10、睬這類異常,它們普通情況下,程序員可不用理睬這類異常,它們雖然很嚴(yán)重,但很少發(fā)生。雖然很嚴(yán)重,但很少發(fā)生。(2) RuntimeException類及其子類:類及其子類: 表示設(shè)計(jì)或?qū)崿F(xiàn)表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問(wèn)題,例如:方面的問(wèn)題,例如: ArithmeticException算術(shù)運(yùn)算異常:算術(shù)運(yùn)算異常: 算術(shù)運(yùn)算術(shù)運(yùn)算時(shí)發(fā)生的異常情況,如整數(shù)相除,除數(shù)為零。算時(shí)發(fā)生的異常情況,如整數(shù)相除,除數(shù)為零。 ClassCastException強(qiáng)迫類型轉(zhuǎn)換異常:強(qiáng)迫類型轉(zhuǎn)換異常: 把一把一個(gè)對(duì)象援用轉(zhuǎn)換成一個(gè)不適宜的類型,如把一個(gè)對(duì)個(gè)對(duì)象援用轉(zhuǎn)換成一個(gè)不適宜的類型,如把一個(gè)對(duì)象援用轉(zhuǎn)換成某個(gè)子類類型。

11、象援用轉(zhuǎn)換成某個(gè)子類類型。 NullPointerException空援用異常:空援用異常: 需求對(duì)象需求對(duì)象援用時(shí)運(yùn)用了一個(gè)援用時(shí)運(yùn)用了一個(gè)null援用。援用。 ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越數(shù)組下標(biāo)越界異常:界異常: 下標(biāo)值超出了數(shù)組大小。下標(biāo)值超出了數(shù)組大小。 NumberFormatException數(shù)字格式異常:數(shù)字格式異常: 試試圖將非數(shù)字格式字符串轉(zhuǎn)換成數(shù)值。圖將非數(shù)字格式字符串轉(zhuǎn)換成數(shù)值。(3) Exception類及其非類及其非RuntimeException子類:子類: 表表示運(yùn)轉(zhuǎn)時(shí)因環(huán)境的影響而引發(fā)的異常,例如:示運(yùn)轉(zhuǎn)時(shí)因環(huán)境的影響

12、而引發(fā)的異常,例如: IOException輸入輸出異常:輸入輸出異常: 在在I/O操作失敗操作失敗或者被中斷時(shí)引發(fā)。其子類包括:或者被中斷時(shí)引發(fā)。其子類包括: EOFException、FileNotFoundException、InterruptedIOException等。等。 InterruptedException中斷異常:中斷異常: 當(dāng)前等待或當(dāng)前等待或睡眠線程被其他線程中斷時(shí)引發(fā)。睡眠線程被其他線程中斷時(shí)引發(fā)。 這類異常并非因設(shè)計(jì)或?qū)崿F(xiàn)引起,是無(wú)法防止的。這類異常并非因設(shè)計(jì)或?qū)崿F(xiàn)引起,是無(wú)法防止的。但普通情況下,程序員應(yīng)該提供相應(yīng)的代碼捕捉和但普通情況下,程序員應(yīng)該提供相應(yīng)的代碼

13、捕捉和處置。處置。受檢查的異常和不受檢查的異常:受檢查的異常和不受檢查的異常:受檢查的異常受檢查的異常 Exception類及其非類及其非RuntimeException子類屬于受子類屬于受檢查的異常;檢查的異常; 受檢查的異常要受編譯系統(tǒng)的檢查。假設(shè)一個(gè)方法受檢查的異常要受編譯系統(tǒng)的檢查。假設(shè)一個(gè)方法能夠會(huì)引發(fā)這類異常而又不能適當(dāng)處置,那么應(yīng)該用能夠會(huì)引發(fā)這類異常而又不能適當(dāng)處置,那么應(yīng)該用throws子句聲明拋出;調(diào)用者或者用子句聲明拋出;調(diào)用者或者用try-catch語(yǔ)句捕語(yǔ)句捕捉處置,或者也用捉處置,或者也用throws子句聲明拋出,并由它的調(diào)子句聲明拋出,并由它的調(diào)用者處置。用者處置

14、。 也就是說(shuō),對(duì)方法中能夠會(huì)拋出的受檢查異常,程也就是說(shuō),對(duì)方法中能夠會(huì)拋出的受檢查異常,程序員必需捕捉處置或聲明拋出,兩者必選其一,否那序員必需捕捉處置或聲明拋出,兩者必選其一,否那么編譯系統(tǒng)將給出錯(cuò)誤信息。么編譯系統(tǒng)將給出錯(cuò)誤信息。受檢查的異常和不受檢查的異常:受檢查的異常和不受檢查的異常:不受檢查的異常:不受檢查的異常: 類類Error和類和類RuntimeException及其子類屬于不受檢及其子類屬于不受檢查的異常,如圖查的異常,如圖8-1所示。所示。 不受檢查的異常不受編譯系統(tǒng)的檢查。對(duì)這類異常,不受檢查的異常不受編譯系統(tǒng)的檢查。對(duì)這類異常,程序員可以捕捉或聲明拋出,但通常可以不加

15、理睬。程序員可以捕捉或聲明拋出,但通常可以不加理睬。異常類的方法和屬性異常類的方法和屬性 (1)異常類的構(gòu)造方法異常類的構(gòu)造方法 public Exception() 創(chuàng)建新異常。創(chuàng)建新異常。public Exception(String message) 用字符串參數(shù)用字符串參數(shù)message描畫(huà)異常信息創(chuàng)建新異常。描畫(huà)異常信息創(chuàng)建新異常。 (2)異常類的方法異常類的方法public String toString() 前往描畫(huà)當(dāng)前異常對(duì)象信息的字前往描畫(huà)當(dāng)前異常對(duì)象信息的字符串。符串。 public String getMessage() 前往描畫(huà)當(dāng)前異常對(duì)象的詳細(xì)前往描畫(huà)當(dāng)前異常對(duì)象的詳

16、細(xì)信息。信息。 public void printStackTrace() 在屏幕上輸出當(dāng)前異常對(duì)在屏幕上輸出當(dāng)前異常對(duì)象運(yùn)用堆棧的軌跡,即程序中先后調(diào)用了哪些方法,象運(yùn)用堆棧的軌跡,即程序中先后調(diào)用了哪些方法,使得運(yùn)轉(zhuǎn)過(guò)程中產(chǎn)生了這個(gè)異常對(duì)象。使得運(yùn)轉(zhuǎn)過(guò)程中產(chǎn)生了這個(gè)異常對(duì)象。 所謂異常的引發(fā)是指因程序運(yùn)轉(zhuǎn)出現(xiàn)異常情況而產(chǎn)所謂異常的引發(fā)是指因程序運(yùn)轉(zhuǎn)出現(xiàn)異常情況而產(chǎn)生異常對(duì)象、進(jìn)而轉(zhuǎn)入異常處置過(guò)程的情形。生異常對(duì)象、進(jìn)而轉(zhuǎn)入異常處置過(guò)程的情形。Java運(yùn)轉(zhuǎn)系統(tǒng)在發(fā)現(xiàn)異常情況時(shí)會(huì)自動(dòng)引發(fā)異常。運(yùn)轉(zhuǎn)系統(tǒng)在發(fā)現(xiàn)異常情況時(shí)會(huì)自動(dòng)引發(fā)異常。自動(dòng)引發(fā)異常自動(dòng)引發(fā)異常 如下例如下例:8.2 引發(fā)異常引發(fā)異

17、?!纠纠?-1】在發(fā)生異常情況時(shí)由運(yùn)轉(zhuǎn)系統(tǒng)引發(fā)異常】在發(fā)生異常情況時(shí)由運(yùn)轉(zhuǎn)系統(tǒng)引發(fā)異常class Demo public static void main(String args) int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; System.out.println(After try/catch blocks.); throw引發(fā)異常引發(fā)異常 異常既可以在發(fā)生異常情況時(shí)由運(yùn)轉(zhuǎn)系統(tǒng)引發(fā),異常既可以在發(fā)生異常情況時(shí)由運(yùn)轉(zhuǎn)系統(tǒng)引發(fā),也可以在程序中用也可以在程序中用throw

18、語(yǔ)句顯式引發(fā)。語(yǔ)句顯式引發(fā)。格式如下:格式如下: throw new ArithmeticException();【例【例8-2】下面程序在被減數(shù)】下面程序在被減數(shù)a小于減數(shù)小于減數(shù)b時(shí)將引發(fā)時(shí)將引發(fā)ArithmeticException異常。異常。1) class Test 2) static int method(int a,int b) 3) if(a b) 4) throw new ArithmeticException(a b); /產(chǎn)生異常產(chǎn)生異常5) return a - b;6) 7) public static void main(String args) 8) method

19、(3, 5);9) 10) 下面是該程序的輸出結(jié)果:下面是該程序的輸出結(jié)果: Exception in thread main java.lang.ArithmeticException: a bat Test.method(Test.java:4)at Test.main(Test.java:8)假設(shè)一個(gè)方法引發(fā)的是受檢查的異常且本人沒(méi)有捕假設(shè)一個(gè)方法引發(fā)的是受檢查的異常且本人沒(méi)有捕捉,那么它必需用捉,那么它必需用throws子句聲明拋出;子句聲明拋出;該方法的調(diào)用者假設(shè)不對(duì)異常進(jìn)展捕捉,那么也必該方法的調(diào)用者假設(shè)不對(duì)異常進(jìn)展捕捉,那么也必需用需用throws子句聲明拋出。子句聲明拋出。下面

20、是包含下面是包含throws子句的方法定義的語(yǔ)法格式:子句的方法定義的語(yǔ)法格式: () throws .8.3 聲明拋出異常聲明拋出異?!纠纠?-3】下面程序與例】下面程序與例8-2中的程序根本一樣,只是中的程序根本一樣,只是method方法能夠拋出的是一個(gè)受檢查的方法能夠拋出的是一個(gè)受檢查的Exception異常,但它既沒(méi)有異常,但它既沒(méi)有捕捉也沒(méi)有聲明拋出,所以是不能經(jīng)過(guò)編譯的。捕捉也沒(méi)有聲明拋出,所以是不能經(jīng)過(guò)編譯的。1) class Test 2) static int method(int a,int b) 3) if(a b) 4) throw new Exception(a b

21、);5) return a - b;6) 7) public static void main(String args) 8) int r = method(3, 5);9) System.out.println(r = + r);10) 11) throws Exception throws Exception 對(duì)不受檢查的異常,同樣可以聲明拋出或進(jìn)展對(duì)不受檢查的異常,同樣可以聲明拋出或進(jìn)展捕捉,這在語(yǔ)法上是允許的。捕捉,這在語(yǔ)法上是允許的。 無(wú)論是受檢查的異常還是不受檢查的異常,對(duì)不無(wú)論是受檢查的異常還是不受檢查的異常,對(duì)不受檢查的異常,不論能否聲明了異常拋出,異常一旦受檢查的異常,不論能

22、否聲明了異常拋出,異常一旦引發(fā),其處置過(guò)程是一致的,即:引發(fā),其處置過(guò)程是一致的,即: 異常沿著方法調(diào)用異常沿著方法調(diào)用的反方向傳播,尋覓并轉(zhuǎn)入適宜的異常處置代碼執(zhí)行。的反方向傳播,尋覓并轉(zhuǎn)入適宜的異常處置代碼執(zhí)行。假設(shè)方法及其一切的調(diào)用者都沒(méi)有提供適宜的處置代假設(shè)方法及其一切的調(diào)用者都沒(méi)有提供適宜的處置代碼,那么異常將最終傳播到運(yùn)轉(zhuǎn)系統(tǒng),運(yùn)轉(zhuǎn)系統(tǒng)調(diào)用碼,那么異常將最終傳播到運(yùn)轉(zhuǎn)系統(tǒng),運(yùn)轉(zhuǎn)系統(tǒng)調(diào)用默許的異常處置代碼后終止程序執(zhí)行。圖默許的異常處置代碼后終止程序執(zhí)行。圖8-2闡明了例闡明了例8-2和例和例8-3中異常引發(fā)和傳送的過(guò)程。中異常引發(fā)和傳送的過(guò)程。圖圖8-2 異常傳播過(guò)程表示圖異常傳播

23、過(guò)程表示圖回想超類和子類中方法覆蓋的要求:回想超類和子類中方法覆蓋的要求:兩個(gè)方法具有一樣的方法簽名即方法名和方法的兩個(gè)方法具有一樣的方法簽名即方法名和方法的參數(shù)完全一致參數(shù)完全一致前往類型一樣前往類型一樣覆蓋方法的訪問(wèn)級(jí)別不能低于被覆蓋方法的訪問(wèn)級(jí)覆蓋方法的訪問(wèn)級(jí)別不能低于被覆蓋方法的訪問(wèn)級(jí)別別覆蓋方法覆蓋方法(子類方法子類方法)不能比被覆蓋方法不能比被覆蓋方法(超類方法超類方法)拋出更多類型的受檢查異常。拋出更多類型的受檢查異常。下面經(jīng)過(guò)例子加以闡明。下面經(jīng)過(guò)例子加以闡明?!纠纠?-4】有以下類定義:】有以下類定義: 1) import java.io.*;2) 3) class Tes

24、tClass4) void testM(BaseClass o) throws IOException5) o.method(); 7) 8) 9) class BaseClass10) void method() throws IOException11) . 12) 請(qǐng)問(wèn)下面哪些請(qǐng)問(wèn)下面哪些BaseClass類的子類定義是合法的?類的子類定義是合法的?A) class A extends BaseClass void method() throws IOException B) class B extends BaseClass void method() throws Exception

25、 C) class C extends BaseClass void method() throws EOFException,FileNotFoundException D) class D extends BaseClass void method() throws IOException,InterruptedException E) class E extends BaseClass void method() F) class F extends BaseClass void method() throws IOException,NullPointerException 【例2.1

26、0】從鍵盤(pán)輸入一個(gè)整數(shù)和實(shí)數(shù),并輸出它們的和 import java.io.*; / 引入引入java.io包包c(diǎn)lass InputDemo public static void main(String args) throws IOException / 用規(guī)范輸入用規(guī)范輸入System.in創(chuàng)建一個(gè)創(chuàng)建一個(gè) BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(System.in); System.out.print(請(qǐng)輸入一個(gè)整數(shù):請(qǐng)輸入一個(gè)整數(shù):);String str = br.read

27、Line(); / 輸入字符行存入字符串輸入字符行存入字符串int i = Integer.parseInt(str);/ 轉(zhuǎn)換字符串為整型數(shù)據(jù)轉(zhuǎn)換字符串為整型數(shù)據(jù) System.out.print(請(qǐng)輸入一個(gè)實(shí)數(shù):請(qǐng)輸入一個(gè)實(shí)數(shù):); str = br.readLine(); float f = Float.parseFloat(str); System.out.print(它們的和是:它們的和是:+(i+f); 假設(shè)不加以捕捉,引發(fā)的異常將沿著方法調(diào)用的假設(shè)不加以捕捉,引發(fā)的異常將沿著方法調(diào)用的反方向往外拋出和傳播,直至反方向往外拋出和傳播,直至Java運(yùn)轉(zhuǎn)系統(tǒng)。通常,運(yùn)轉(zhuǎn)系統(tǒng)。通常,這并

28、不是所希望的結(jié)果。普通來(lái)說(shuō),引發(fā)異常的方這并不是所希望的結(jié)果。普通來(lái)說(shuō),引發(fā)異常的方法的調(diào)用者應(yīng)該捕捉,并根據(jù)詳細(xì)情況處置異常,法的調(diào)用者應(yīng)該捕捉,并根據(jù)詳細(xì)情況處置異常,從而阻止異常繼續(xù)往外傳播。從而阻止異常繼續(xù)往外傳播。Java運(yùn)用運(yùn)用try-catch-finally語(yǔ)句來(lái)捕捉和處置能夠發(fā)生的異常,該語(yǔ)句的語(yǔ)句來(lái)捕捉和處置能夠發(fā)生的異常,該語(yǔ)句的語(yǔ)法格式如下:語(yǔ)法格式如下: 8.4 捕捉異常捕捉異常try / 此處是能夠發(fā)生異常的代碼此處是能夠發(fā)生異常的代碼 catch( ) / 異常的處置代碼異常的處置代碼 catch( ) / 異常的處置代碼異常的處置代碼finally / 總是要執(zhí)

29、行的代碼總是要執(zhí)行的代碼該語(yǔ)句包含該語(yǔ)句包含try、catch和和finally三個(gè)子句。其中,三個(gè)子句。其中,catch子句可以子句可以有多個(gè),而且至少有一個(gè)有多個(gè),而且至少有一個(gè)catch子句或子句或finally子句。子句。try子句包含一段能夠要發(fā)生異常的代碼。一旦發(fā)子句包含一段能夠要發(fā)生異常的代碼。一旦發(fā)生異常,將由后面的生異常,將由后面的catch子句捕捉處置。每個(gè)子句捕捉處置。每個(gè)catch子句有一個(gè)參數(shù),參數(shù)類型指明該子句可以捕捉的子句有一個(gè)參數(shù),參數(shù)類型指明該子句可以捕捉的異常類型。假設(shè)子句指定的參數(shù)類型是所發(fā)生的異異常類型。假設(shè)子句指定的參數(shù)類型是所發(fā)生的異常的類或者是其超

30、類,那么闡明常的類或者是其超類,那么闡明catch子句可以捕捉子句可以捕捉該異常。此時(shí),運(yùn)轉(zhuǎn)系統(tǒng)將把異常對(duì)象的援用值傳該異常。此時(shí),運(yùn)轉(zhuǎn)系統(tǒng)將把異常對(duì)象的援用值傳送給送給catch子句的參數(shù)變量,并將控制流轉(zhuǎn)移到該子句的參數(shù)變量,并將控制流轉(zhuǎn)移到該catch子句,執(zhí)行子句內(nèi)的異常處置代碼。之后,接子句,執(zhí)行子句內(nèi)的異常處置代碼。之后,接著執(zhí)行著執(zhí)行try語(yǔ)句后面的代碼。語(yǔ)句后面的代碼。假設(shè)假設(shè)try子句內(nèi)的代碼沒(méi)有發(fā)生任何異常,那么跳子句內(nèi)的代碼沒(méi)有發(fā)生任何異常,那么跳過(guò)過(guò)catch子句,直接執(zhí)行子句,直接執(zhí)行try語(yǔ)句后面的代碼。語(yǔ)句后面的代碼。8.4.1 try和和catch子句子句cla

31、ss Demo public static void main(String args) try int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; catch(ArithmeticException e) / 捕獲算術(shù)運(yùn)算異常捕獲算術(shù)運(yùn)算異常 System.out.println(Divide by 0: + e); catch(ArrayIndexOutOfBoundsException e) System.out.println(Array index oob: + e

32、); System.out.println(After try/catch blocks.); 【例【例8-5】try和和catch子句舉例子句舉例a = 0Divide by 0: java.lang.ArithmeticException: / by zeroAfter try/catch blocks.最后闡明兩點(diǎn):最后闡明兩點(diǎn): (1) 當(dāng)發(fā)生異常時(shí),假設(shè)有當(dāng)發(fā)生異常時(shí),假設(shè)有catch捕捉到了異常,那么捕捉到了異常,那么不論詳細(xì)的異常處置代碼如何甚至不含任何語(yǔ)不論詳細(xì)的異常處置代碼如何甚至不含任何語(yǔ)句,句,Java運(yùn)轉(zhuǎn)系統(tǒng)都以為該異常已被消除;運(yùn)轉(zhuǎn)系統(tǒng)都以為該異常已被消除;(2) 當(dāng)

33、執(zhí)行完異常處置代碼后,控制流并不會(huì)回到異當(dāng)執(zhí)行完異常處置代碼后,控制流并不會(huì)回到異常發(fā)生處,而是執(zhí)行常發(fā)生處,而是執(zhí)行try語(yǔ)句后面的代碼假設(shè)沒(méi)有語(yǔ)句后面的代碼假設(shè)沒(méi)有finally子句。子句。 try子句內(nèi)的代碼能夠會(huì)發(fā)生多種類型的異常,而子句內(nèi)的代碼能夠會(huì)發(fā)生多種類型的異常,而try語(yǔ)句也允許有多個(gè)語(yǔ)句也允許有多個(gè)catch子句,每個(gè)子句,每個(gè)catch子句可以子句可以捕捉一種類型包括子類型的異常。捕捉一種類型包括子類型的異常。 當(dāng)然,每次執(zhí)行當(dāng)然,每次執(zhí)行try語(yǔ)句時(shí),至多只能拋出一個(gè)異語(yǔ)句時(shí),至多只能拋出一個(gè)異常,相應(yīng)地,至多只能有一個(gè)異常處置代碼被執(zhí)行。常,相應(yīng)地,至多只能有一個(gè)異常

34、處置代碼被執(zhí)行。 8.4.2 多個(gè)多個(gè)catch子句子句 當(dāng)異常發(fā)生時(shí),運(yùn)轉(zhuǎn)系統(tǒng)將按先后次序依次判別當(dāng)異常發(fā)生時(shí),運(yùn)轉(zhuǎn)系統(tǒng)將按先后次序依次判別各各catch子句,假設(shè)發(fā)現(xiàn)某個(gè)子句,假設(shè)發(fā)現(xiàn)某個(gè)catch子句可以捕捉該異子句可以捕捉該異常,就執(zhí)行其中的處置代碼,而其后面的常,就執(zhí)行其中的處置代碼,而其后面的catch子句子句將被忽略。將被忽略。 留意:處置子類型異常的留意:處置子類型異常的catch子句一定要放在處子句一定要放在處置超類型異常的置超類型異常的catch子句之前。子句之前。 假設(shè)將一個(gè)處置超類型異常的假設(shè)將一個(gè)處置超類型異常的catch子句放在處置子句放在處置子類型異常的子類型異常

35、的catch子句之前,或者兩個(gè)子句之前,或者兩個(gè)catch子句捕子句捕捉同一類型的異常,編譯系統(tǒng)都將給出錯(cuò)誤信息。捉同一類型的異常,編譯系統(tǒng)都將給出錯(cuò)誤信息。public class Test2 public static void main (String args) int x=0; int y; try y=100/x; catch (Exception ex) ex.printStackTrace(); catch (ArithmeticException ex) ex.printStackTrace(); (ArithmeticException ex)(Exception ex)T

36、est2.java:9: 已捕捉到異常 java.lang.ArithmeticException catch (ArithmeticException ex) 1 錯(cuò)誤編譯不經(jīng)過(guò):運(yùn)用運(yùn)用finally子句的益處是:子句的益處是: 控制流不論以何種緣由分開(kāi)控制流不論以何種緣由分開(kāi)try語(yǔ)句,都要先執(zhí)行語(yǔ)句,都要先執(zhí)行finally子句。子句。 所以,可以將那些無(wú)論能否發(fā)生異常、異常無(wú)論能所以,可以將那些無(wú)論能否發(fā)生異常、異常無(wú)論能否被捕捉都需求執(zhí)行的代碼放置在否被捕捉都需求執(zhí)行的代碼放置在finally子句內(nèi)。子句內(nèi)。8.4.3 finally子句子句控制流分開(kāi)控制流分開(kāi)try語(yǔ)句的情況可分

37、為以下幾種:語(yǔ)句的情況可分為以下幾種: try子句代碼正常執(zhí)行,沒(méi)有引發(fā)異常;子句代碼正常執(zhí)行,沒(méi)有引發(fā)異常; try子句代碼執(zhí)行時(shí)引發(fā)異常,但被子句代碼執(zhí)行時(shí)引發(fā)異常,但被catch子句捕捉處子句捕捉處置;置; try子句代碼執(zhí)行時(shí)引發(fā)異常,但沒(méi)有子句代碼執(zhí)行時(shí)引發(fā)異常,但沒(méi)有catch子句能捕子句能捕捉處置;捉處置; try子句代碼執(zhí)行時(shí)引發(fā)異常,且被子句代碼執(zhí)行時(shí)引發(fā)異常,且被catch子句捕捉,子句捕捉,但在執(zhí)行異常處置代碼時(shí)發(fā)生新的異常。但在執(zhí)行異常處置代碼時(shí)發(fā)生新的異常。留意:因留意:因return、break或或continue等跳轉(zhuǎn)語(yǔ)句不論等跳轉(zhuǎn)語(yǔ)句不論是出如今是出如今try子

38、句中,還是出如今子句中,還是出如今catch子句中要分開(kāi)子句中要分開(kāi)try語(yǔ)句時(shí),同樣需求先執(zhí)行語(yǔ)句時(shí),同樣需求先執(zhí)行finally子句。子句。1) class FinallyDemo 2) static void m1(int i) 3) try 4) if(i = 2) 5) System.out.println(第第2種情況:種情況: 發(fā)生算術(shù)運(yùn)算異常發(fā)生算術(shù)運(yùn)算異常);6) throw new ArithmeticException();7) if(i = 3) 8) System.out.println(第第3種情況:種情況: 發(fā)生數(shù)字格式異常發(fā)生數(shù)字格式異常);9) throw n

39、ew NumberFormatException();10) if(i = 4) 11) System.out.println(第第4種情況:種情況: 發(fā)生數(shù)組下標(biāo)越界異常發(fā)生數(shù)組下標(biāo)越界異常);12) throw new ArrayIndexOutOfBoundsException();13) 14) System.out.println(第第1種情況:種情況: 沒(méi)有發(fā)生異常沒(méi)有發(fā)生異常);15) 【例【例8-9】finally子句舉例子句舉例15) catch(ArithmeticException e)16) System.out.println(異常被捕捉處置異常被捕捉處置); 17)

40、 catch(ArrayIndexOutOfBoundsException e)18) System.out.println(異常被捕捉,但又被重新引發(fā)異常被捕捉,但又被重新引發(fā));19) throw e; 20) finally21) System.out.println(這是這是finally子句子句); 23) System.out.println(這是這是try語(yǔ)句后的代碼語(yǔ)句后的代碼);24) 25) public static void main(String args)26) for(int i = 1; i java Testcaught java.lang.ArrayInde

41、xOutOfBoundsException: 0 in mainexiting from main假設(shè)命令行的第假設(shè)命令行的第1個(gè)參數(shù)為非數(shù)字格式字符串,下面是程序的輸個(gè)參數(shù)為非數(shù)字格式字符串,下面是程序的輸出結(jié)果:出結(jié)果: C:java Test aaacaught java.lang.NumberFormatException: aaa in m1exiting from m1exiting from main假設(shè)命令行的第一個(gè)參數(shù)為數(shù)字假設(shè)命令行的第一個(gè)參數(shù)為數(shù)字0,下面是程序的輸出結(jié)果:,下面是程序的輸出結(jié)果:C: java Test 0caught java.lang.Arithme

42、ticException: / by zero in mainexiting from maintry子句發(fā)生的異??梢杂烧Z(yǔ)句中的某個(gè)子句發(fā)生的異??梢杂烧Z(yǔ)句中的某個(gè)catch子句捕子句捕捉處置,但在執(zhí)行捉處置,但在執(zhí)行catch子句內(nèi)的異常處置代碼時(shí)也子句內(nèi)的異常處置代碼時(shí)也能夠再引發(fā)新的異常。此時(shí),原先的異常被遺棄,能夠再引發(fā)新的異常。此時(shí),原先的異常被遺棄,新的異常從新的異常從try語(yǔ)句拋出并向外傳播。與語(yǔ)句拋出并向外傳播。與未捕捉到的未捕捉到的異常異常類似,該新異?;蛘哂赏鈱宇愃疲撔庐惓;蛘哂赏鈱觮ry語(yǔ)句的語(yǔ)句的catch子子句捕捉,或者由方法的調(diào)用者處置。句捕捉,或者由方法的調(diào)用

43、者處置。8.4.5 再引發(fā)異常再引發(fā)異常1) import java.io.IOException; /【例【例8-8】再引發(fā)異常舉例】再引發(fā)異常舉例2) class Test 3) static void m1() throws IOException 4) try5) throw new RuntimeException(demo_1); 6) catch(RuntimeException e)7) System.out.println(caught + e + in m1); 8) throw new IOException(demo_2); 9) 10) public static v

44、oid main(String args) 11) try12) m1(); 13) catch(IOException e)14) System.out.println(caught + e + in main); 15) System.out.println(exiting from main);16) 17)下面是程序的輸出結(jié)果:下面是程序的輸出結(jié)果: caught java.lang.RuntimeException: demo_1 in m1caught java.io.IOException: demo_2 in mainexiting from main 8.5 定義本人的異常類

45、型定義本人的異常類型 自定義的異常類型必需是自定義的異常類型必需是Throwable類的類的子類。只需子類。只需Throwable類及其子類的實(shí)例才類及其子類的實(shí)例才可以被引發(fā)和捕捉??梢员灰l(fā)和捕捉。通常將自定義異常類型定義成通常將自定義異常類型定義成Exception的的子類,以產(chǎn)生受檢查的異常。子類,以產(chǎn)生受檢查的異常。 Java異常處置機(jī)制的特點(diǎn)是方法的調(diào)用異常處置機(jī)制的特點(diǎn)是方法的調(diào)用者必需認(rèn)識(shí)和處置方法能夠會(huì)拋出的受檢者必需認(rèn)識(shí)和處置方法能夠會(huì)拋出的受檢查異常,而對(duì)不受檢查的異常,調(diào)用者那查異常,而對(duì)不受檢查的異常,調(diào)用者那么可以不加理睬。么可以不加理睬。例:在定義銀行類時(shí),假設(shè)取

46、錢數(shù)大于余額那么作為異常處置(InsufficientFundsException)。思緒: 產(chǎn)生異常的條件是余額少于取額,因此能否拋出異常要先判別該條件。 確定產(chǎn)生異常的方法,應(yīng)該在取錢方法withdrawal中產(chǎn)生異常InsufficientFundsException 。 處置異常安排在調(diào)用withdrawal的時(shí)候,因此withdrawal方法要聲明異常,由上級(jí)方法捕獲并處置。 要定義好本人的異異常。public class InsufficientFundsException extends Exception private Bank excepbank; private doub

47、le excepAmount; InsufficientFundsException(Bank ba, double dAmount) excepbank = ba; excepAmount = dAmount; public String toString() String str = The balance + excepbank.getbalance() + The withdrawal was+excepAmount; return str; class Bank double balance; /余額余額 public void deposite(double dAmount) /存

48、錢存錢 if(dAmount0.0) balance = balance + dAmount; public void withdrawal(double dAmount) throws InsufficientFundsException /取錢取錢 if( balancedAmout ) throw new InsufficientFundsException(this, dAmount); balance = balance-dAmount; public double getbalance() /獲取余額獲取余額 return balance; public class Excepti

49、onDemo public static void main(String args) try Bank ba = new Bank(); ba.deposite(50); ba.withdrawal(100); System.out.println(Withdrawal successful!); catch(Exception e) System.out.println(e.toString(); 【例】設(shè)計(jì)本人的異常。從鍵盤(pán)輸入一個(gè)【例】設(shè)計(jì)本人的異常。從鍵盤(pán)輸入一個(gè)doubledouble類類型的數(shù),假設(shè)不小于型的數(shù),假設(shè)不小于0.00.0,那么輸出它的平方根,假,那么輸出它的平方根,

50、假設(shè)小于設(shè)小于0.00.0,那么輸出提示信息,那么輸出提示信息 輸入錯(cuò)誤!輸入錯(cuò)誤! 。 import java.io.import java.io.* *; ;class MyException extends Exceptionclass MyException extends Exception double x; double x; MyException(double x) MyException(double x) this.x=x; this.x=x; public String toString() public String toString() return return

51、輸入錯(cuò)誤輸入錯(cuò)誤:x0.0+ x=+x; :x0.0+ x=+x; public class MySqrt static void test(double x) throws MyException if(x 0.0) throw new MyException(x); else System.out.println(Math.sqrt(x); public static void main(String args) throws IOException try System.out.print(求輸入實(shí)數(shù)的平方根求輸入實(shí)數(shù)的平方根,請(qǐng)輸入一個(gè)實(shí)數(shù)請(qǐng)輸入一個(gè)實(shí)數(shù):); BufferedRead

52、er br = new BufferedReader(new InputStreamReader(System.in); String s = br.readLine(); test(Double.parseDouble(s); catch(MyExceptionClass e) System.out.println(e.toString(); 與普通方法一樣,構(gòu)造方法也可以引發(fā)異常、捕與普通方法一樣,構(gòu)造方法也可以引發(fā)異常、捕捉異?;蛘呗暶鲯伋霎惓!?shí)踐上,構(gòu)造方法有時(shí)捉異常或者聲明拋出異常。實(shí)踐上,構(gòu)造方法有時(shí)比普通方法更需求運(yùn)用異常處置機(jī)制。對(duì)于普通方比普通方法更需求運(yùn)用異常處置機(jī)制。對(duì)

53、于普通方法,有時(shí)可以經(jīng)過(guò)前往一個(gè)特殊值來(lái)表示其執(zhí)行出法,有時(shí)可以經(jīng)過(guò)前往一個(gè)特殊值來(lái)表示其執(zhí)行出現(xiàn)了異常。例如,一個(gè)方法的前往類型是一種援用現(xiàn)了異常。例如,一個(gè)方法的前往類型是一種援用類型,且在正常情況下它總是能前往一個(gè)對(duì)象的援類型,且在正常情況下它總是能前往一個(gè)對(duì)象的援用,那么就可以前往一個(gè)用,那么就可以前往一個(gè)null值表示非正常情況,而值表示非正常情況,而不是拋出異常。這種處置方式不適用于構(gòu)造方法。不是拋出異常。這種處置方式不適用于構(gòu)造方法。構(gòu)造方法沒(méi)有前往類型,構(gòu)造方法體不能運(yùn)用帶表構(gòu)造方法沒(méi)有前往類型,構(gòu)造方法體不能運(yùn)用帶表達(dá)式的達(dá)式的return語(yǔ)句。下面是構(gòu)造方法引發(fā)和拋出異常語(yǔ)句。下面是構(gòu)造方法引發(fā)和拋出異常的一個(gè)例子:的一個(gè)例子: 8.6 構(gòu)造方法與異常處置構(gòu)造方法與異常處置1 class TimeException extends Ex

溫馨提示

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