第5章定義用戶年齡的異常類_第1頁
第5章定義用戶年齡的異常類_第2頁
第5章定義用戶年齡的異常類_第3頁
第5章定義用戶年齡的異常類_第4頁
第5章定義用戶年齡的異常類_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章任務(wù)5——定義用戶年齡的異常類5.1任務(wù)描述5.2技術(shù)要點5.3任務(wù)實施

5.1任務(wù)描述

學(xué)生在線考試系統(tǒng)中,用戶注冊需要輸入年齡,若輸入不合理的年齡,我們將在程序中拋出異常,并做相關(guān)處理。為此,本章任務(wù)是自定義一個關(guān)于年齡的異常類。

5.2技術(shù)要點

在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免的,其中錯誤包括語法錯誤和運行錯誤。一般稱編譯時被檢測出來的錯誤為語法錯誤,這種錯誤一旦產(chǎn)生程序?qū)⒉槐贿\行。然而,并非所有錯誤都能在編譯期間檢測到,有些問題可能會在程序運行時才暴露出來。例如,想打開的文件不存在、網(wǎng)絡(luò)連接中斷、受控操作數(shù)超出預(yù)定范圍、除數(shù)為0等。這類在程序運行時代碼序列中產(chǎn)生的出錯情況稱為運行錯誤。這種運行錯誤倘若沒有及時進行處理,可能會造成程序中斷、數(shù)據(jù)遺失乃至系統(tǒng)崩潰等問題。這種運行錯誤也就是我們常說的“異常”。在不支持異常處理的傳統(tǒng)程序設(shè)計語言中,設(shè)計的程序要包含很長的代碼來識別潛在的運行錯誤的條件。傳統(tǒng)的檢測錯誤的方法包括使用一些可以設(shè)置為真或假的變量來對錯誤進行捕獲,相似的錯誤條件必須在每個程序中分別處理,這顯然麻煩而且低效。例如在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,要調(diào)用函數(shù)并通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。這種錯誤處理機制會導(dǎo)致把大部分精力花在出錯處理上;且只把能夠想到的錯誤考慮到,對其他情況無法處理;程序可讀性也很差,大量的錯誤處理代碼混雜在程序中;出錯返回信息量太少,無法更確切地了解錯誤狀況或原因。例5-1的程序中沒有任何異常處理的相關(guān)代碼,編譯時能順利通過,但運行時屏幕顯示如圖5-1所示的界面,并中斷程序的運行。

例5-1TestException.java

1classTestException1{

2publicstaticvoidmain(String

args[]){

3inta=8,b=0;

4

intc=a/b;//除數(shù)為0,出現(xiàn)異常

5System.out.print(c);

6}

7}圖5-1運行時錯誤提示程序出錯原因是因為除數(shù)為0。Java發(fā)現(xiàn)這個錯誤之后,便由系統(tǒng)拋出“ArithmeticException”這個類的異常,用來說明錯誤的原因,以及出錯的位置是在TestException1.java程序中的第4行,并停止運行程序。因此,如果沒有編寫處理異常的程序代碼,則Java的默認(rèn)異常處理機制會先拋出異常,然后終止程序運行。上例中出現(xiàn)的異常比較簡單,在編程中完全可以避免,但是有的異常在程序的編寫過程中是無法預(yù)知的。例如,要訪問的文件不存在,網(wǎng)絡(luò)連接的過程中發(fā)生中斷等。為了處理程序運行中一些無法避免的異常,Java語言提供了異常處理機制,為方法的異常終止和出錯處理提供了清楚的接口,同時將功能代碼和異常處理的代碼進行分開編寫。5.2.1異常類

1.異常類的層次結(jié)構(gòu)

Java中的所有異常都是Throwable類或子類,而Throwable類又直接繼承于Object類。Throwable類有兩個子類:java.1ang.Error類與java.1ang.Exception類。Exception類又進一步細(xì)分為RuntimeException(運行異常)類和Non-RuntimeException(非運行異常)類。圖5-2顯示了各異常之間的繼承關(guān)系。圖5-2異常類的層次結(jié)構(gòu)

2.Error類及其子類

Error類專門用來處理嚴(yán)重影響程序運行的錯誤,一般情況下我們不會設(shè)計程序代碼去捕捉這種錯誤,其原因在于即使捕捉到它,也無法給予適當(dāng)?shù)奶幚怼@?,虛擬機錯誤、動態(tài)鏈接失敗等。表5-1列出一些常見的Error類。表5-1常見的Error類

3.Exception類及其子類

相對于Error類,Exception類包含了一般性的異常,這些異常通常在捕捉到之后可以做一些妥善的處理,以確保程序繼續(xù)運行。從異常類的繼承層次結(jié)構(gòu)圖中可以看出,Exception類的若干子類中包含運行時異常類(RuntimeException)和非運行時異常類。

1)運行時異常

運行異常是在Java運行系統(tǒng)執(zhí)行過程中的異常,對于RuntimeException類的異常,即使不編寫異常處理的程序代碼,依然可以編譯成功,因為該異常是在程序運行時才有可能發(fā)生的,例如算術(shù)異常(除數(shù)為0)、數(shù)組下標(biāo)越界等。由于這類異常產(chǎn)生得比較頻繁,并且通過仔細(xì)編程完全可以避免。如果顯式地通過異常處理機制去處理,則會影響整個程序的運行效率。因此,對于RuntimeException類,一般由系統(tǒng)自動檢測,并將它們交給缺省的異常處理程序。表5-2列出幾種常見的運行時異常類。表5-2常見運行時異常類

2)非運行時異常

非運行時異常是由編譯器在編譯時檢測是否會發(fā)生在方法的執(zhí)行過程中的異常。對于非運行時的異常類,即使通過仔細(xì)編程也無法避免。例如,要訪問的文件不存在等情況。這類異常通常都在JDK說明文檔中定義的方法后面通過throws關(guān)鍵字將異常拋出,編程時必須捕獲并做相應(yīng)處理。如圖5-3所示,java.io.Reader類中定義了read方法:

publicint

read(CharBuffertarget)throwsIOException

在編程中,若要使用read方法,則必須對其可能產(chǎn)生的IOException異常進行捕獲和相應(yīng)的處理。圖5-3java.io.Reader類的read方法表5-3列出了常見的非運行時異常。表5-3常見的非運行時異常5.2.2異常的捕獲和處理

例5-1中異常發(fā)生后,系統(tǒng)自動把這個異常拋了出來,但是拋出來之后沒有程序代碼去捕捉(catch)異常并進行相應(yīng)的處理。Java中的異常處理是由try、catch與finally三個關(guān)鍵字所組成的程序塊進行的。其語法為

try{

正常程序段,可能拋出異常;

}

catch(異常類1異常變量){

捕捉異常類1有關(guān)的處理程序段;

}

catch(異常類2異常變量){

捕捉異常類2有關(guān)的處理程序段;

}

finally{

一定會運行的程序代碼;

}

1.try塊——捕獲異常

try用于監(jiān)控可能發(fā)生異常的程序代碼塊是否發(fā)生異常,如果發(fā)生異,try部分將拋出異常類所產(chǎn)生的對象并立刻結(jié)束執(zhí)行,而轉(zhuǎn)向異常處理代碼catch部分。try塊中。對于系統(tǒng)產(chǎn)生的異常或程序塊中未用try監(jiān)視所產(chǎn)生的異常,將一律由Java運行系統(tǒng)自動將異常對象拋出。

2.catch塊——處理異常

拋出的對象如果屬于catch()括號內(nèi)欲捕獲的異常類,則catch會捕獲此異常,然后進入到catch塊里繼續(xù)運行。catch包括兩個參數(shù):一個是類名,指出捕獲的異常類型,必須是Throwable類的子類;一個是參數(shù)名,用來引用被捕獲的對象。catch塊所捕獲的對象并不需要與它的參數(shù)類型精確匹配,它可以捕獲參數(shù)中指出的異常類的對象及其所有子類的

對象。在catch塊中,對異常處理的操作根據(jù)異常的不同而執(zhí)行不同的操作。例如,可以進行錯誤恢復(fù)或者退出系統(tǒng),通常的操作是打印異常的相關(guān)信息,包括異常的名稱、產(chǎn)生異常的方法名、方法調(diào)用的完整、執(zhí)行棧的軌跡等。異常類常用方法如表5-4所示。表5-4異常類常用方法例5-2TryCatchDemo.java

1publicclassTryCatchDemo{

2publicstaticvoidmain(String

args[]){

3try{

4inta=8,b=0;

5intc=a/b;

6System.out.print(c);

7}

8catch(ArithmeticExceptione){

9System.out.println(“發(fā)生的異常簡短描述是:"+e.getMessage());

10System.out.println("發(fā)生的異常詳細(xì)信息是:"+e.toString());

11}

12}

13}

程序運行結(jié)果如圖5-4所示。圖5-4try-catch示例

3.finally塊——清除工作

finally塊是可選的,通過finally語句可以為異常處理提供一個統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的處理。不論在try代碼塊中是否發(fā)生了異常,finally代碼塊中的語句都會被執(zhí)行。通常在finally語句中可以進行資源的清除工作。例如,關(guān)閉打開的文件,刪除臨時文件等。

例5-3TryCatchFinally.java

1publicclassTryCatchFinally{

2publicstaticvoidmain(String

args[]){

3try{

4int

arr[]=newint[5];

5arr[5]=100;

6}catch(ArrayIndexOutOfBoundsExceptione){

7System.out.println("數(shù)組越界!");

8}catch(Exceptione){

9System.out.println("捕獲所有其他Exception類異常!");

10}

11finally{

12 System.out.println("程序無條件執(zhí)行該語句!");

13}

14}

15}

程序運行結(jié)果為

數(shù)組越界!

程序無條件執(zhí)行該語句!

當(dāng)代碼中可能出現(xiàn)多種異常時,可以分別用多個catch語句捕獲,往往將最后一個catch子句的異常類指定為所有異常類的父類Exception,這樣可以在發(fā)生的異常不能和catch子句中所提供的異常類型匹配時,將異常全部交于catch(Exceptione)對應(yīng)的程序代碼來處理。但要注意,異常子類必須在其任何父類之前使用,若將catch(Exceptione)作為第一條catch子句,則所有異常將被其捕獲,而不能執(zhí)行其后的catch子句。5.2.3異常的拋出

異常的拋出可以分為兩大類:一類是由系統(tǒng)自動拋出(例5-2和例5-3);另一類則是通過關(guān)鍵字throw將異常對象顯式地拋出。顯式拋出異常從某種程度上實現(xiàn)了將處理異常的代碼從正常流程代碼中分離開,使得程序的主線相對完整,同時增加了程序的可讀性和可維護性。異常沿著調(diào)用層次向上拋出,交由調(diào)用它的方法來處理。

異常拋出的語法如下:

thrownew異常類();

其中,異常類必須為Throwable類及其子類。例5-4TestException2.java

1classTestException2

2{staticvoidthrowOne(inti)

3{if(i==0)

4thrownewClassNotFoundException();

5}

6publicstaticvoidmain(String

args[])

7{

8throwOne(0);

9}

10}例5-4中,方法throwOne()通過throw將產(chǎn)生的classNot

FoundException的異常對象拋出。但是該程序仍然有編譯錯誤,這是因為在throwOne()方法處沒有進行異常類的聲明,同時在main()方法中沒有對異常進行捕獲和處理。5.2.4異常的聲明

如果程序中定義的方法可能產(chǎn)生異常,可以直接在該方法中捕獲并處理該異常,也可以向上傳遞,由調(diào)用它的方法來處理異常。這時需要在該方法名后面進行異常的聲明,表示該方法中可能有異常產(chǎn)生。一個throws子句列出了可能拋出的異常類型。若該方法中可能拋出多個異常,則將異常類型用逗號分隔。包括throws子句的方法聲明的一般格式如下:

<類型說明>方法名(參數(shù)列表)throws<異常類型列表>

{

方法體;

}例5-5TestException3.java

1classTestException3{

2staticvoidthrowOne(inti)throwsArithmeticException{

3if(i==0)

4thrownewArithmeticException("i值為零");

5}

6publicstaticvoidmain(String

args[]){

7try{

8throwOne(0);

9}

10catch(ArithmeticExceptione){

11 System.out.println(“已捕獲到異常錯誤:"+e.getMessage());

12}

13}

14}

程序運行結(jié)果為

已捕獲到異常錯誤:i值為零5.2.5自定義異常類

Java系統(tǒng)定義了有限的異常用以處理可以預(yù)見的、較為常見的運行錯誤,對于某個應(yīng)用所特有的運行錯誤,有時則需要創(chuàng)建自己的異常類來處理特定的情況。用戶自定義的異常類,只需繼承一個已有的異常類就可以了,包括繼承Execption類及其子類,或者繼承已自定義好的異常類。如果沒有特別說明,可以直接用Execption類作為父類。自定義類的格式如下:

class異常類名extendsException

{

}

由于Exception類并沒有定義它自己的任何方法,而它繼承了Throwable類提供的方法,所以,任何異常都繼承了Throwabe定義的方法,常用方法如表5-4所示。也可以在自定義的異常類中覆蓋這些方法中的一個或多個方法。自定義異常不能由系統(tǒng)自動拋出,只能在方法中通過throw關(guān)鍵字顯式地拋出異常對象。使用自定義異常的步驟如下:

(1)首先通過繼承java.lang.Exception類聲明自定義的異常類。

(2)在方法的聲明部分用throws語句聲明該方法可能拋出的異常。

(3)在方法體的適當(dāng)位置創(chuàng)建自定義異常類的對象,并用throw語句將異常拋出。

(4)調(diào)用該方法時對可能產(chǎn)生的異常進行捕獲,并處理異常。例5-6演示了如何創(chuàng)建自定義的異常類以及如何通過throw關(guān)鍵字拋出異常。

例5-6MyException.java

1classMyExceptionextendsException{

2privateintnum;

3MyException(inta){

4num=a;

5}

6publicStringtoString(){

7return"MyException["+num+"]";

8}

9}

10classExceptionDemo{

11staticvoidtest(inti)throwsMyException{

12System.out.println("調(diào)用test("+i+")");

13if(i>10)

14thrownewMyException(i);

15System.out.println("正常退出");

16}

17publicstaticvoidmain(String

args[]){

18try{

19test(5);

20test(15);

21}

22catch(MyExceptione){

23System.out.println(''捕捉''+e.toString());

24}

25}

26}

程序運行結(jié)果為

調(diào)用test(5)

正常退出

調(diào)用test(15)

捕捉MyException[15]

5.3任務(wù)實施

例5-7中是自定義年齡異常,當(dāng)輸入的年齡大于50或小于18時,將拋出異常。

例5-7Age.java

1classAgeExceptionextendsException{

2Stringmessage;

3AgeException(String

name,intm){

4message=name+"的年齡"+m+"不正確";

5}

6publicStringtoString(){

7returnmessage;

8}

9}

10classUser{

11privateintage=1;

12privateStringname;

13User(Stringname){

14 =name;

15}

16publicvoidsetAge(intage)throwsAgeException{

17if(age>=50||age<=18)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論