《異常處理》_第1頁(yè)
《異常處理》_第2頁(yè)
《異常處理》_第3頁(yè)
《異常處理》_第4頁(yè)
《異常處理》_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1,第八章 異常處理(Exception),8.1 異常分類 8.2 引發(fā)異常 8.3 聲明拋出異常 8.4 捕捉異常 8.5 定義自己的異常類型 8.6 構(gòu)造方法與異常處理 8.7 小結(jié),2,try-catch-finally語句 ,其語法格式: try /可能發(fā)生異常的代碼 catch(異常類型1 變量) /異常的處理代碼 catch(異常類型2 變量) /異常的處理代碼 . finally /總是要執(zhí)行的代碼 ,3,異常(例外) 是方法代碼運(yùn)行時(shí)出現(xiàn)的非正常狀態(tài),這種非正常狀態(tài)使程序無法或不能再正常地繼續(xù)往下運(yùn)行。 常見的異常: 數(shù)組下標(biāo)越界 除數(shù)為零 內(nèi)存溢出 文件找不到等。,4,運(yùn)行

2、機(jī)制: 當(dāng)一個(gè)方法在運(yùn)行時(shí)發(fā)生異常時(shí),將產(chǎn)生相應(yīng)類型的一個(gè)異常對(duì)象、中止代碼繼續(xù)往下運(yùn)行并尋找相應(yīng)的異常處理代碼。 異常處理: 1 判斷異常類型 2 產(chǎn)生對(duì)象 3 捕獲處理異常,5,異常對(duì)象記錄著這個(gè)異常的一些描述和狀態(tài)信息。 方法運(yùn)行失敗時(shí),記錄這個(gè)異常信息的異常對(duì)象將產(chǎn)生(或稱為引發(fā),拋出,throw),它有兩種引發(fā)方式: 1 系統(tǒng)自動(dòng)引發(fā) 2 在程序中由throw語句引發(fā) 異常對(duì)象引發(fā)后,系統(tǒng)根據(jù)異常對(duì)象的類型,首先在當(dāng)前方法尋找相應(yīng)的異常處理代碼,找到后就將控制流轉(zhuǎn)入該異常處理代碼并向其傳遞異常對(duì)象(稱為捕獲該異常,catch),異常處理代碼可以根據(jù)接受到的異常對(duì)象進(jìn)行相應(yīng)的處理;,6

3、,尋找相應(yīng)的異常處理代碼的過程:,當(dāng)前方法 直接或間接調(diào)用者 找到,傳遞異常對(duì)象并進(jìn)行異常處理 沒有找到,調(diào)用默認(rèn)的異常處理程序,中止當(dāng)前線程,7,舉例(沒有異常處理的情況),1) class ExceptionDivideBy0 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) ,8,Exception in

4、 thread main java.lang.ArithmeticException: / by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8) Press any key to continue.,9,具有異常處理的情況,class ExceptionDivideBy0 static void method() int x = 0,z=10; try int y = 10 / x; System.out.prin

5、tln(z=+z); catch(ArithmeticException e) System.out.println(ArithmeticException); System.out.println(After try/catch blocks.); public static void main(String args) method(); System.out.println(After method.); ,10,ArithmeticException After try/catch blocks. After method.,11,每個(gè)異常由類Throwable或者它的一個(gè)子類的實(shí)例表

6、示,這樣的對(duì)象可被拋出并能被傳遞給合適的異常處理代碼處理。Throwable類及其子類統(tǒng)稱為異常類,每個(gè)異常類表示一種異常類型。 Throwable類是Object類的直接子類,其本身又有兩個(gè)直接子類: Error與Exception類。RuntimeException類是Exception類的直接子類,如圖8-1所示。這里, Error類、RuntimeException類和Exception類分別代表某一類異常類型:,8.1 異常分類,12,圖8-1 異常類型及其分類,13,(1) Error類及其子類: 表示災(zāi)難性的、普通程序很難恢復(fù)的異常,例如: NoClassDefFoundErro

7、r(類定義沒找到異常): JVM無法找到相應(yīng)的class文件。 OutOfMemoryError(內(nèi)存越界異常): JVM沒有足夠的存儲(chǔ)空間滿足對(duì)象創(chuàng)建的要求。 NoSuchMethodError(調(diào)用不存在的方法異常): 在改變某個(gè)方法的簽名后,原先要調(diào)用該方法的應(yīng)用程序,在運(yùn)行時(shí)就會(huì)拋出該異常。 一般情況下,程序員可不必理會(huì)這類異常,它們雖然很嚴(yán)重,但很少發(fā)生。,14,(2) RuntimeException類及其子類: 表示設(shè)計(jì)或?qū)崿F(xiàn)方面的問題,例如: ArithmeticException(算術(shù)運(yùn)算異常): 算術(shù)運(yùn)算時(shí)發(fā)生的異常情況,如整數(shù)相除,除數(shù)為零。 ClassCastExcep

8、tion(強(qiáng)制類型轉(zhuǎn)換異常): 把一個(gè)對(duì)象引用轉(zhuǎn)換成一個(gè)不合適的類型,如把一個(gè)對(duì)象引用轉(zhuǎn)換成某個(gè)子類類型。 NullPointerException(空引用異常): 需要對(duì)象引用時(shí)使用了一個(gè)null引用。 ArrayIndexOutOfBoundsException(數(shù)組下標(biāo)越界異常): 下標(biāo)值超出了數(shù)組大小。 NumberFormatException(數(shù)字格式異常): 試圖將非數(shù)字格式字符串轉(zhuǎn)換成數(shù)值。,15,(3) Exception類及其非RuntimeException子類: 表示運(yùn)行時(shí)因環(huán)境的影響而引發(fā)的異常,例如: IOException(輸入輸出異常): 在I/O操作失敗或者被

9、中斷時(shí)引發(fā)。其子類包括: EOFException、FileNotFoundException、InterruptedIOException等。 InterruptedException(中斷異常): 當(dāng)前等待或睡眠線程被其他線程中斷時(shí)引發(fā)。 這類異常并非因設(shè)計(jì)或?qū)崿F(xiàn)引起,是無法避免的。但一般情況下,程序員應(yīng)該提供相應(yīng)的代碼捕捉和處理。,16,受檢查的異常和不受檢查的異常: 受檢查的異常 Exception類及其非RuntimeException子類屬于受檢查的異常; 受檢查的異常要受編譯系統(tǒng)的檢查。如果一個(gè)方法可能會(huì)引發(fā)這類異常而又不能適當(dāng)處理,那么應(yīng)該用throws子句聲明拋出;調(diào)用者或者

10、用try-catch語句捕捉處理,或者也用throws子句聲明拋出,并由它的調(diào)用者處理。 也就是說,對(duì)方法中可能會(huì)拋出的受檢查異常,程序員必須捕捉處理或聲明拋出,兩者必選其一,否則編譯系統(tǒng)將給出錯(cuò)誤信息。,17,受檢查的異常和不受檢查的異常: 不受檢查的異常: 類Error和類RuntimeException及其子類屬于不受檢查的異常,如圖8-1所示。 不受檢查的異常不受編譯系統(tǒng)的檢查。對(duì)這類異常,程序員可以捕捉或聲明拋出,但通常可以不加理會(huì)。,18,異常類的方法和屬性,(1)異常類的構(gòu)造方法 public Exception() 創(chuàng)建新異常。 public Exception(String

11、message) 用字符串參數(shù)message描述異常信息創(chuàng)建新異常。 (2)異常類的方法 public String toString() 返回描述當(dāng)前異常對(duì)象信息的字符串。 public String getMessage() 返回描述當(dāng)前異常對(duì)象的詳細(xì)信息。 public void printStackTrace() 在屏幕上輸出當(dāng)前異常對(duì)象使用堆棧的軌跡,即程序中先后調(diào)用了哪些方法,使得運(yùn)行過程中產(chǎn)生了這個(gè)異常對(duì)象。,19,所謂異常的引發(fā)是指因程序運(yùn)行出現(xiàn)異常情況而產(chǎn)生異常對(duì)象、進(jìn)而轉(zhuǎn)入異常處理過程的情形。Java運(yùn)行系統(tǒng)在發(fā)現(xiàn)異常情況時(shí)會(huì)自動(dòng)引發(fā)異常。 自動(dòng)引發(fā)異常 如下例:,8.2

12、引發(fā)異常,20,【例8-1】在發(fā)生異常情況時(shí)由運(yù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.); ,21,throw引發(fā)異常 異常既可以在發(fā)生異常情況時(shí)由運(yùn)行系統(tǒng)引發(fā),也可以在程序中用throw語句顯式引發(fā)。 格式如下: throw new ArithmeticExcepti

13、on();,22,【例8-2】下面程序在被減數(shù)a小于減數(shù)b時(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)生異常 5) return a - b; 6) 7) public static void main(String args) 8) method(3, 5); 9) 10) ,下面是該程序的輸出結(jié)果: Exception in thread main java.lang.Arithme

14、ticException: a b at Test.method(Test.java:4) at Test.main(Test.java:8),23,如果一個(gè)方法引發(fā)的是受檢查的異常且自己沒有捕捉,那么它必須用throws子句聲明拋出; 該方法的調(diào)用者如果不對(duì)異常進(jìn)行捕捉,那么也必須用throws子句聲明拋出。 下面是包含throws子句的方法定義的語法格式: () throws .,8.3 聲明拋出異常,24,【例8-3】下面程序與例8-2中的程序基本相同,只是method方法可能拋出的是一個(gè)受檢查的Exception異常,但它既沒有捕捉也沒有聲明拋出,所以是不能通過編譯的。 1) clas

15、s Test 2) static int method(int a,int b) 3) if(a b) 4) throw new Exception(a b); 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 ,25,對(duì)不受檢查的異常,同樣可以聲明拋出(或進(jìn)行捕捉),這在語法上是允許的。 無論是受檢查的異常還是不受檢查的異常

16、,對(duì)不受檢查的異常,不管是否聲明了異常拋出,異常一旦引發(fā),其處理過程是一致的,即: 異常沿著方法調(diào)用的反方向傳播,尋找并轉(zhuǎn)入合適的異常處理代碼執(zhí)行。如果方法及其所有的調(diào)用者都沒有提供合適的處理代碼,那么異常將最終傳播到運(yùn)行系統(tǒng),運(yùn)行系統(tǒng)調(diào)用默認(rèn)的異常處理代碼后終止程序執(zhí)行。圖8-2說明了例8-2和例8-3中異常引發(fā)和傳遞的過程。,26,圖8-2 異常傳播過程示意圖,27,回憶超類和子類中方法覆蓋的要求: 兩個(gè)方法具有相同的方法簽名(即方法名和方法的參數(shù)完全一致) 返回類型相同 覆蓋方法的訪問級(jí)別不能低于被覆蓋方法的訪問級(jí)別 覆蓋方法(子類方法)不能比被覆蓋方法(超類方法)拋出更多類型的受檢查異

17、常。 下面通過例子加以說明。,28,【例8-4】有以下類定義: 1) import java.io.*; 2) 3) class TestClass 4) void testM(BaseClass o) throws IOException 5) o.method(); 7) 8) 9) class BaseClass 10) void method() throws IOException 11) . 12) ,29,請(qǐng)問下面哪些BaseClass類的子類定義是合法的? A) class A extends BaseClass void method() throws IOException

18、 B) class B extends BaseClass void method() throws Exception C) class C extends BaseClass void method() throws EOFException,FileNotFoundException ,30,D) class D extends BaseClass void method() throws IOException,InterruptedException E) class E extends BaseClass void method() F) class F extends BaseC

19、lass void method() throws IOException,NullPointerException ,31,【例2.10】從鍵盤輸入一個(gè)整數(shù)和實(shí)數(shù),并輸出它們的和,import java.io.*; / 引入java.io包 class InputDemo public static void main(String args) throws IOException / 用標(biāo)準(zhǔn)輸入System.in創(chuàng)建一個(gè) BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in

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

21、常的方法的調(diào)用者應(yīng)該捕捉,并根據(jù)具體情況處理異常,從而阻止異常繼續(xù)往外傳播。Java使用try-catch-finally語句來捕捉和處理可能發(fā)生的異常,該語句的語法格式如下:,8.4 捕捉異常,34,try / 此處是可能發(fā)生異常的代碼 catch( ) / 異常的處理代碼 catch( ) / 異常的處理代碼 finally / 總是要執(zhí)行的代碼 該語句包含try、catch和finally三個(gè)子句。其中,catch子句可以有多個(gè),而且至少有一個(gè)catch子句或finally子句。,35,try子句包含一段可能要發(fā)生異常的代碼。一旦發(fā)生異常,將由后面的catch子句捕捉處理。每個(gè)catch

22、子句有一個(gè)參數(shù),參數(shù)類型指明該子句能夠捕捉的異常類型。如果子句指定的參數(shù)類型是所發(fā)生的異常的類或者是其超類,則說明catch子句能夠捕捉該異常。此時(shí),運(yùn)行系統(tǒng)將把異常對(duì)象的引用值傳遞給catch子句的參數(shù)變量,并將控制流轉(zhuǎn)移到該catch子句,執(zhí)行子句內(nèi)的異常處理代碼。之后,接著執(zhí)行try語句后面的代碼。 如果try子句內(nèi)的代碼沒有發(fā)生任何異常,那么跳過catch子句,直接執(zhí)行try語句后面的代碼。,8.4.1 try和catch子句,36,class Demo public static void main(String args) try int a = args.length; Syst

23、em.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; catch(ArithmeticException e) / 捕獲算術(shù)運(yùn)算異常 System.out.println(Divide by 0: + e); catch(ArrayIndexOutOfBoundsException e) System.out.println(Array index oob: + e); System.out.println(After try/catch blocks.); ,【例8-5】try和catch子句舉例,37,a = 0 Divi

24、de by 0: java.lang.ArithmeticException: / by zero After try/catch blocks.,38,最后說明兩點(diǎn): (1) 當(dāng)發(fā)生異常時(shí),如果有catch捕捉到了異常,那么不管具體的異常處理代碼如何(甚至不含任何語句),Java運(yùn)行系統(tǒng)都認(rèn)為該異常已被消除; (2) 當(dāng)執(zhí)行完異常處理代碼后,控制流并不會(huì)回到異常發(fā)生處,而是執(zhí)行try語句后面的代碼(如果沒有finally子句)。,39,try子句內(nèi)的代碼可能會(huì)發(fā)生多種類型的異常,而try語句也允許有多個(gè)catch子句,每個(gè)catch子句可以捕捉一種類型(包括子類型)的異常。 當(dāng)然,每次執(zhí)行t

25、ry語句時(shí),至多只能拋出一個(gè)異常,相應(yīng)地,至多只能有一個(gè)異常處理代碼被執(zhí)行。,8.4.2 多個(gè)catch子句,40,當(dāng)異常發(fā)生時(shí),運(yùn)行系統(tǒng)將按先后次序依次判斷各catch子句,如果發(fā)現(xiàn)某個(gè)catch子句能夠捕捉該異常,就執(zhí)行其中的處理代碼,而其后面的catch子句將被忽略。 注意:處理子類型異常的catch子句一定要放在處理超類型異常的catch子句之前。 如果將一個(gè)處理超類型異常的catch子句放在處理子類型異常的catch子句之前,或者兩個(gè)catch子句捕捉同一類型的異常,編譯系統(tǒng)都將給出錯(cuò)誤信息。,41,public class Test2 public static void main

26、 (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),42,使用finally子句的好處是: 控制流不管以何種原因離開try語句,都要先執(zhí)行finally子句。 所以,可以將那些無論是否發(fā)生異常、異常無論是否被捕捉都需要執(zhí)行的代碼放置在finally子句內(nèi)。,8.4.3 finally子句,

27、43,控制流離開try語句的情況可分為以下幾種: try子句代碼正常執(zhí)行,沒有引發(fā)異常; try子句代碼執(zhí)行時(shí)引發(fā)異常,但被catch子句捕捉處理; try子句代碼執(zhí)行時(shí)引發(fā)異常,但沒有catch子句能捕捉處理; try子句代碼執(zhí)行時(shí)引發(fā)異常,且被catch子句捕捉,但在執(zhí)行異常處理代碼時(shí)發(fā)生新的異常。 注意:因return、break或continue等跳轉(zhuǎn)語句(不管是出現(xiàn)在try子句中,還是出現(xiàn)在catch子句中)要離開try語句時(shí),同樣需要先執(zhí)行finally子句。,44,1) class FinallyDemo 2) static void m1(int i) 3) try 4) if

28、(i = 2) 5) System.out.println(第2種情況: 發(fā)生算術(shù)運(yùn)算異常); 6) throw new ArithmeticException(); 7) if(i = 3) 8) System.out.println(第3種情況: 發(fā)生數(shù)字格式異常); 9) throw new NumberFormatException(); 10) if(i = 4) 11) System.out.println(第4種情況: 發(fā)生數(shù)組下標(biāo)越界異常); 12) throw new ArrayIndexOutOfBoundsException(); 13) 14) System.out.p

29、rintln(第1種情況: 沒有發(fā)生異常); 15) ,【例8-9】finally子句舉例,45,15) catch(ArithmeticException e) 16) System.out.println(異常被捕捉處理); 17) catch(ArrayIndexOutOfBoundsException e) 18) System.out.println(異常被捕捉,但又被重新引發(fā)); 19) throw e; 20) finally 21) System.out.println(這是finally子句); 23) System.out.println(這是try語句后的代碼); 24)

30、 25) public static void main(String args) 26) for(int i = 1; i 5; i+) 27) try 28) m1(i); 29) catch(RuntimeException e) 30) System.out.println(由main方法捕捉到異常); ,46,下面是程序的輸出結(jié)果: 第1種情況:沒有發(fā)生異常 這是finally子句 這是try語句后的代碼 第2種情況:發(fā)生算術(shù)運(yùn)算異常 異常被捕捉處理 這是finally子句 這是try語句后的代碼,47,下面是程序的輸出結(jié)果(續(xù)): 第3種情況:發(fā)生數(shù)字格式異常 這是finally子

31、句 由main方法捕捉到異常 第4種情況:發(fā)生數(shù)組下標(biāo)越界異常 異常被捕捉,但又被重新引發(fā) 這是finally子句 由main方法捕捉到異常,48,當(dāng)try子句發(fā)生異常時(shí),如果沒有一個(gè)catch子句能夠捕捉到,則異常從該try語句拋出并向外傳播。 如果try語句本身是另外一個(gè)try語句的try子句的一部分,那么異常就由該外層try語句的catch子句捕捉處理。 如果沒有外層的try語句,或者外層try語句也沒有catch子句能夠捕捉該異常,則異常被傳播到方法的調(diào)用者那里,由調(diào)用方法處理。,8.4.4 未捕捉到的異常,49,1) class Test /例8-7未捕捉到的異常被傳播并由調(diào)用方法捕

32、捉。 2) static void m1(String s) 3) try 4) int x = Integer.parseInt(s); 5) int y = 10 / x; 6) catch(NumberFormatException e) 7) System.out.println(caught + e + in m1); 8) System.out.println(exiting from m1); 9) 10) public static void main(String args) 11) try 12) m1(args0); 13) catch(ArrayIndexOutOfBo

33、undsException e) 14) System.out.println(caught + e + in main); 15) catch(ArithmeticException e) 16) System.out.println(caught + e + in main); 17) System.out.println(exiting from main); 18) ,50,該程序可以在不同情況下發(fā)生3種不同類型的異常。如果命令行不提供參數(shù),下面是程序的輸出結(jié)果: C:java Test caught java.lang.ArrayIndexOutOfBoundsException:

34、0 in main exiting from main 如果命令行的第1個(gè)參數(shù)為非數(shù)字格式字符串,下面是程序的輸出結(jié)果: C:java Test aaa caught java.lang.NumberFormatException: aaa in m1 exiting from m1 exiting from main 如果命令行的第一個(gè)參數(shù)為數(shù)字0,下面是程序的輸出結(jié)果: C: java Test 0 caught java.lang.ArithmeticException: / by zero in main exiting from main,51,try子句發(fā)生的異??梢杂烧Z句中的某個(gè)

35、catch子句捕捉處理,但在執(zhí)行catch子句內(nèi)的異常處理代碼時(shí)也可能再引發(fā)新的異常。此時(shí),原先的異常被遺棄,新的異常從try語句拋出并向外傳播。與未捕捉到的異常類似,該新異?;蛘哂赏鈱觮ry語句的catch子句捕捉,或者由方法的調(diào)用者處理。,8.4.5 再引發(fā)異常,52,1) import java.io.IOException; /【例8-8】再引發(fā)異常舉例 2) class Test 3) static void m1() throws IOException 4) try 5) throw new RuntimeException(demo_1); 6) catch(RuntimeEx

36、ception e) 7) System.out.println(caught + e + in m1); 8) throw new IOException(demo_2); 9) 10) public static void main(String args) 11) try 12) m1(); 13) catch(IOException e) 14) System.out.println(caught + e + in main); 15) System.out.println(exiting from main); 16) 17),53,下面是程序的輸出結(jié)果: caught java.l

37、ang.RuntimeException: demo_1 in m1 caught java.io.IOException: demo_2 in main exiting from main,54,8.5 定義自己的異常類型 自定義的異常類型必須是Throwable類的子類。只有Throwable類及其子類的實(shí)例才能夠被引發(fā)和捕捉。通常將自定義異常類型定義成Exception的子類,以產(chǎn)生受檢查的異常。 Java異常處理機(jī)制的特點(diǎn)是方法的調(diào)用者必須認(rèn)識(shí)和處理方法可能會(huì)拋出的受檢查異常,而對(duì)不受檢查的異常,調(diào)用者則可以不加理會(huì)。,55,例:在定義銀行類時(shí),若取錢數(shù)大于余額則作為異常處理(Insu

38、fficientFundsException)。 思路: 產(chǎn)生異常的條件是余額少于取額,因此是否拋出異常要先判斷該條件。 確定產(chǎn)生異常的方法,應(yīng)該在取錢方法withdrawal中產(chǎn)生異常InsufficientFundsException 。 處理異常安排在調(diào)用withdrawal的時(shí)候,因此withdrawal方法要聲明異常,由上級(jí)方法捕獲并處理。 要定義好自己的異異常。,56,public class InsufficientFundsException extends Exception private Bank excepbank; private double excepAmount

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

40、0.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; ,58,public class ExceptionDemo public st

41、atic 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(); ,59,【例】設(shè)計(jì)自己的異常。從鍵盤輸入一個(gè)double類型的數(shù),若不小于0.0,則輸出它的平方根,若小于0.0,則輸出提示信息輸入錯(cuò)誤!。 import java.io.*; class MyException extend

42、s Exception double x; MyException(double x) this.x=x; public String toString() return 輸入錯(cuò)誤:x0.0+ x=+x; ,60,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 IOExcepti

43、on try System.out.print(求輸入實(shí)數(shù)的平方根,請(qǐng)輸入一個(gè)實(shí)數(shù):); BufferedReader br = new BufferedReader(new InputStreamReader(System.in); String s = br.readLine(); test(Double.parseDouble(s); catch(MyExceptionClass e) System.out.println(e.toString(); ,61,與普通方法一樣,構(gòu)造方法也可以引發(fā)異常、捕捉異常或者聲明拋出異常。實(shí)際上,構(gòu)造方法有時(shí)比普通方法更需要使用異常處理機(jī)制。對(duì)于普通方法,有時(shí)可以通過返回一個(gè)特殊值來表示其執(zhí)行出現(xiàn)了異常。例如,一個(gè)方法的返回類型是一種引用類型,且在正常情況下它總是能返回一個(gè)對(duì)象的引用,那么就可以返回一個(gè)null值表示非正常情

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論