版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年高性能單鏡頭反光照相機項目資金申請報告
- 電腦終端軟件服務(wù)合同(標(biāo)準(zhǔn)版)
- 面料知識大全
- 房地產(chǎn)市場營銷考卷
- 四年級數(shù)學(xué)下冊數(shù)學(xué)教案
- 蘇教版小學(xué)科學(xué)四年級下學(xué)期教案
- 贛州離婚協(xié)議書模板2023
- 玻璃頂棚安裝協(xié)議書模板
- 北京隔離免責(zé)協(xié)議書模板
- 巴中商鋪合伙協(xié)議書模板
- 【上課精品】高考專題復(fù)習(xí):小說環(huán)境描寫的作用 課件41張
- 主題班會《誠信伴我行》課件
- 門診質(zhì)量考核標(biāo)準(zhǔn)
- 放射科危急值登記表
- 個人車位租賃合同電子版
- 人力資源管理《社會保險》知識點總結(jié)
- 危大工程管理監(jiān)理實施細(xì)則
- 小學(xué)數(shù)學(xué) 五年級上 第一單元第11課時《練習(xí)二》教案
- 骨折的固定課件
- 九年級英語U1單詞表(附音標(biāo))
- 精選吉林聯(lián)通基站機房標(biāo)準(zhǔn)化整治技術(shù)規(guī)范
評論
0/150
提交評論