版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章任務(wù)5——定義用戶年齡的異常類5.1任務(wù)描述5.2技術(shù)要點(diǎn)5.3任務(wù)實(shí)施
5.1任務(wù)描述
學(xué)生在線考試系統(tǒng)中,用戶注冊(cè)需要輸入年齡,若輸入不合理的年齡,我們將在程序中拋出異常,并做相關(guān)處理。為此,本章任務(wù)是自定義一個(gè)關(guān)于年齡的異常類。
5.2技術(shù)要點(diǎn)
在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的,其中錯(cuò)誤包括語法錯(cuò)誤和運(yùn)行錯(cuò)誤。一般稱編譯時(shí)被檢測(cè)出來的錯(cuò)誤為語法錯(cuò)誤,這種錯(cuò)誤一旦產(chǎn)生程序?qū)⒉槐贿\(yùn)行。然而,并非所有錯(cuò)誤都能在編譯期間檢測(cè)到,有些問題可能會(huì)在程序運(yùn)行時(shí)才暴露出來。例如,想打開的文件不存在、網(wǎng)絡(luò)連接中斷、受控操作數(shù)超出預(yù)定范圍、除數(shù)為0等。這類在程序運(yùn)行時(shí)代碼序列中產(chǎn)生的出錯(cuò)情況稱為運(yùn)行錯(cuò)誤。這種運(yùn)行錯(cuò)誤倘若沒有及時(shí)進(jìn)行處理,可能會(huì)造成程序中斷、數(shù)據(jù)遺失乃至系統(tǒng)崩潰等問題。這種運(yùn)行錯(cuò)誤也就是我們常說的“異?!?。在不支持異常處理的傳統(tǒng)程序設(shè)計(jì)語言中,設(shè)計(jì)的程序要包含很長(zhǎng)的代碼來識(shí)別潛在的運(yùn)行錯(cuò)誤的條件。傳統(tǒng)的檢測(cè)錯(cuò)誤的方法包括使用一些可以設(shè)置為真或假的變量來對(duì)錯(cuò)誤進(jìn)行捕獲,相似的錯(cuò)誤條件必須在每個(gè)程序中分別處理,這顯然麻煩而且低效。例如在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯(cuò)誤,同時(shí),要調(diào)用函數(shù)并通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯(cuò)誤事件并進(jìn)行處理。這種錯(cuò)誤處理機(jī)制會(huì)導(dǎo)致把大部分精力花在出錯(cuò)處理上;且只把能夠想到的錯(cuò)誤考慮到,對(duì)其他情況無法處理;程序可讀性也很差,大量的錯(cuò)誤處理代碼混雜在程序中;出錯(cuò)返回信息量太少,無法更確切地了解錯(cuò)誤狀況或原因。例5-1的程序中沒有任何異常處理的相關(guān)代碼,編譯時(shí)能順利通過,但運(yùn)行時(shí)屏幕顯示如圖5-1所示的界面,并中斷程序的運(yùn)行。
例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運(yùn)行時(shí)錯(cuò)誤提示程序出錯(cuò)原因是因?yàn)槌龜?shù)為0。Java發(fā)現(xiàn)這個(gè)錯(cuò)誤之后,便由系統(tǒng)拋出“ArithmeticException”這個(gè)類的異常,用來說明錯(cuò)誤的原因,以及出錯(cuò)的位置是在TestException1.java程序中的第4行,并停止運(yùn)行程序。因此,如果沒有編寫處理異常的程序代碼,則Java的默認(rèn)異常處理機(jī)制會(huì)先拋出異常,然后終止程序運(yùn)行。上例中出現(xiàn)的異常比較簡(jiǎn)單,在編程中完全可以避免,但是有的異常在程序的編寫過程中是無法預(yù)知的。例如,要訪問的文件不存在,網(wǎng)絡(luò)連接的過程中發(fā)生中斷等。為了處理程序運(yùn)行中一些無法避免的異常,Java語言提供了異常處理機(jī)制,為方法的異常終止和出錯(cuò)處理提供了清楚的接口,同時(shí)將功能代碼和異常處理的代碼進(jìn)行分開編寫。5.2.1異常類
1.異常類的層次結(jié)構(gòu)
Java中的所有異常都是Throwable類或子類,而Throwable類又直接繼承于Object類。Throwable類有兩個(gè)子類:java.1ang.Error類與java.1ang.Exception類。Exception類又進(jìn)一步細(xì)分為RuntimeException(運(yùn)行異常)類和Non-RuntimeException(非運(yùn)行異常)類。圖5-2顯示了各異常之間的繼承關(guān)系。圖5-2異常類的層次結(jié)構(gòu)
2.Error類及其子類
Error類專門用來處理嚴(yán)重影響程序運(yùn)行的錯(cuò)誤,一般情況下我們不會(huì)設(shè)計(jì)程序代碼去捕捉這種錯(cuò)誤,其原因在于即使捕捉到它,也無法給予適當(dāng)?shù)奶幚?。例如,虛擬機(jī)錯(cuò)誤、動(dòng)態(tài)鏈接失敗等。表5-1列出一些常見的Error類。表5-1常見的Error類
3.Exception類及其子類
相對(duì)于Error類,Exception類包含了一般性的異常,這些異常通常在捕捉到之后可以做一些妥善的處理,以確保程序繼續(xù)運(yùn)行。從異常類的繼承層次結(jié)構(gòu)圖中可以看出,Exception類的若干子類中包含運(yùn)行時(shí)異常類(RuntimeException)和非運(yùn)行時(shí)異常類。
1)運(yùn)行時(shí)異常
運(yùn)行異常是在Java運(yùn)行系統(tǒng)執(zhí)行過程中的異常,對(duì)于RuntimeException類的異常,即使不編寫異常處理的程序代碼,依然可以編譯成功,因?yàn)樵摦惓J窃诔绦蜻\(yùn)行時(shí)才有可能發(fā)生的,例如算術(shù)異常(除數(shù)為0)、數(shù)組下標(biāo)越界等。由于這類異常產(chǎn)生得比較頻繁,并且通過仔細(xì)編程完全可以避免。如果顯式地通過異常處理機(jī)制去處理,則會(huì)影響整個(gè)程序的運(yùn)行效率。因此,對(duì)于RuntimeException類,一般由系統(tǒng)自動(dòng)檢測(cè),并將它們交給缺省的異常處理程序。表5-2列出幾種常見的運(yùn)行時(shí)異常類。表5-2常見運(yùn)行時(shí)異常類
2)非運(yùn)行時(shí)異常
非運(yùn)行時(shí)異常是由編譯器在編譯時(shí)檢測(cè)是否會(huì)發(fā)生在方法的執(zhí)行過程中的異常。對(duì)于非運(yùn)行時(shí)的異常類,即使通過仔細(xì)編程也無法避免。例如,要訪問的文件不存在等情況。這類異常通常都在JDK說明文檔中定義的方法后面通過throws關(guān)鍵字將異常拋出,編程時(shí)必須捕獲并做相應(yīng)處理。如圖5-3所示,java.io.Reader類中定義了read方法:
publicint
read(CharBuffertarget)throwsIOException
在編程中,若要使用read方法,則必須對(duì)其可能產(chǎn)生的IOException異常進(jìn)行捕獲和相應(yīng)的處理。圖5-3java.io.Reader類的read方法表5-3列出了常見的非運(yùn)行時(shí)異常。表5-3常見的非運(yùn)行時(shí)異常5.2.2異常的捕獲和處理
例5-1中異常發(fā)生后,系統(tǒng)自動(dòng)把這個(gè)異常拋了出來,但是拋出來之后沒有程序代碼去捕捉(catch)異常并進(jìn)行相應(yīng)的處理。Java中的異常處理是由try、catch與finally三個(gè)關(guān)鍵字所組成的程序塊進(jìn)行的。其語法為
try{
正常程序段,可能拋出異常;
}
catch(異常類1異常變量){
捕捉異常類1有關(guān)的處理程序段;
}
catch(異常類2異常變量){
捕捉異常類2有關(guān)的處理程序段;
}
finally{
一定會(huì)運(yùn)行的程序代碼;
}
1.try塊——捕獲異常
try用于監(jiān)控可能發(fā)生異常的程序代碼塊是否發(fā)生異常,如果發(fā)生異,try部分將拋出異常類所產(chǎn)生的對(duì)象并立刻結(jié)束執(zhí)行,而轉(zhuǎn)向異常處理代碼catch部分。try塊中。對(duì)于系統(tǒng)產(chǎn)生的異?;虺绦驂K中未用try監(jiān)視所產(chǎn)生的異常,將一律由Java運(yùn)行系統(tǒng)自動(dòng)將異常對(duì)象拋出。
2.catch塊——處理異常
拋出的對(duì)象如果屬于catch()括號(hào)內(nèi)欲捕獲的異常類,則catch會(huì)捕獲此異常,然后進(jìn)入到catch塊里繼續(xù)運(yùn)行。catch包括兩個(gè)參數(shù):一個(gè)是類名,指出捕獲的異常類型,必須是Throwable類的子類;一個(gè)是參數(shù)名,用來引用被捕獲的對(duì)象。catch塊所捕獲的對(duì)象并不需要與它的參數(shù)類型精確匹配,它可以捕獲參數(shù)中指出的異常類的對(duì)象及其所有子類的
對(duì)象。在catch塊中,對(duì)異常處理的操作根據(jù)異常的不同而執(zhí)行不同的操作。例如,可以進(jìn)行錯(cuò)誤恢復(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ā)生的異常簡(jiǎn)短描述是:"+e.getMessage());
10System.out.println("發(fā)生的異常詳細(xì)信息是:"+e.toString());
11}
12}
13}
程序運(yùn)行結(jié)果如圖5-4所示。圖5-4try-catch示例
3.finally塊——清除工作
finally塊是可選的,通過finally語句可以為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的處理。不論在try代碼塊中是否發(fā)生了異常,finally代碼塊中的語句都會(huì)被執(zhí)行。通常在finally語句中可以進(jìn)行資源的清除工作。例如,關(guān)閉打開的文件,刪除臨時(shí)文件等。
例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}
程序運(yùn)行結(jié)果為
數(shù)組越界!
程序無條件執(zhí)行該語句!
當(dāng)代碼中可能出現(xiàn)多種異常時(shí),可以分別用多個(gè)catch語句捕獲,往往將最后一個(gè)catch子句的異常類指定為所有異常類的父類Exception,這樣可以在發(fā)生的異常不能和catch子句中所提供的異常類型匹配時(shí),將異常全部交于catch(Exceptione)對(duì)應(yīng)的程序代碼來處理。但要注意,異常子類必須在其任何父類之前使用,若將catch(Exceptione)作為第一條catch子句,則所有異常將被其捕獲,而不能執(zhí)行其后的catch子句。5.2.3異常的拋出
異常的拋出可以分為兩大類:一類是由系統(tǒng)自動(dòng)拋出(例5-2和例5-3);另一類則是通過關(guān)鍵字throw將異常對(duì)象顯式地拋出。顯式拋出異常從某種程度上實(shí)現(xiàn)了將處理異常的代碼從正常流程代碼中分離開,使得程序的主線相對(duì)完整,同時(shí)增加了程序的可讀性和可維護(hù)性。異常沿著調(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的異常對(duì)象拋出。但是該程序仍然有編譯錯(cuò)誤,這是因?yàn)樵趖hrowOne()方法處沒有進(jìn)行異常類的聲明,同時(shí)在main()方法中沒有對(duì)異常進(jìn)行捕獲和處理。5.2.4異常的聲明
如果程序中定義的方法可能產(chǎn)生異常,可以直接在該方法中捕獲并處理該異常,也可以向上傳遞,由調(diào)用它的方法來處理異常。這時(shí)需要在該方法名后面進(jìn)行異常的聲明,表示該方法中可能有異常產(chǎn)生。一個(gè)throws子句列出了可能拋出的異常類型。若該方法中可能拋出多個(gè)異常,則將異常類型用逗號(hào)分隔。包括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(“已捕獲到異常錯(cuò)誤:"+e.getMessage());
12}
13}
14}
程序運(yùn)行結(jié)果為
已捕獲到異常錯(cuò)誤:i值為零5.2.5自定義異常類
Java系統(tǒng)定義了有限的異常用以處理可以預(yù)見的、較為常見的運(yùn)行錯(cuò)誤,對(duì)于某個(gè)應(yīng)用所特有的運(yùn)行錯(cuò)誤,有時(shí)則需要?jiǎng)?chuàng)建自己的異常類來處理特定的情況。用戶自定義的異常類,只需繼承一個(gè)已有的異常類就可以了,包括繼承Execption類及其子類,或者繼承已自定義好的異常類。如果沒有特別說明,可以直接用Execption類作為父類。自定義類的格式如下:
class異常類名extendsException
{
}
由于Exception類并沒有定義它自己的任何方法,而它繼承了Throwable類提供的方法,所以,任何異常都繼承了Throwabe定義的方法,常用方法如表5-4所示。也可以在自定義的異常類中覆蓋這些方法中的一個(gè)或多個(gè)方法。自定義異常不能由系統(tǒng)自動(dòng)拋出,只能在方法中通過throw關(guān)鍵字顯式地拋出異常對(duì)象。使用自定義異常的步驟如下:
(1)首先通過繼承java.lang.Exception類聲明自定義的異常類。
(2)在方法的聲明部分用throws語句聲明該方法可能拋出的異常。
(3)在方法體的適當(dāng)位置創(chuàng)建自定義異常類的對(duì)象,并用throw語句將異常拋出。
(4)調(diào)用該方法時(shí)對(duì)可能產(chǎn)生的異常進(jì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}
程序運(yùn)行結(jié)果為
調(diào)用test(5)
正常退出
調(diào)用test(15)
捕捉MyException[15]
5.3任務(wù)實(shí)施
例5-7中是自定義年齡異常,當(dāng)輸入的年齡大于50或小于18時(shí),將拋出異常。
例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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度旅游行業(yè)代理開票服務(wù)合同協(xié)議3篇
- 2024年度建筑工程代付工程款第三方服務(wù)合同6篇
- 2024年度戶外廣告導(dǎo)演合作合同3篇
- 2024年度知識(shí)產(chǎn)權(quán)擔(dān)保與技術(shù)成果轉(zhuǎn)化實(shí)施合同3篇
- 2024年度研學(xué)旅游行業(yè)人才培養(yǎng)戰(zhàn)略合作框架合同3篇
- 2024年度農(nóng)業(yè)大棚建筑與環(huán)保節(jié)能技術(shù)合作協(xié)議3篇
- 2024年智能家居系統(tǒng)安裝預(yù)約協(xié)議3篇
- 2024年度地鐵口商業(yè)房屋租賃合同規(guī)范范本9篇
- 2024年養(yǎng)殖場(chǎng)土地承包與農(nóng)產(chǎn)品收購(gòu)合同樣本3篇
- 2024年度高層建筑鋼筋班組承包施工合同范本2篇
- 成都中醫(yī)藥大學(xué)博士申請(qǐng)
- 公司業(yè)績(jī)匯報(bào)及規(guī)劃
- 統(tǒng)編版(2024版)七年級(jí)上冊(cè)歷史期末復(fù)習(xí)課件
- 【MOOC】工程制圖-北京科技大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 招標(biāo)代理崗位職責(zé)規(guī)章制度
- 幼兒園大班音樂《獻(xiàn)上最美的哈達(dá)》課件
- 專題07 非連性閱讀(新熱點(diǎn)題型)-2023-2024學(xué)年八年級(jí)語文下學(xué)期期中專題復(fù)習(xí)(深圳專用)(原卷版)
- 2024年凈化車間工程的合同
- 殘疾兒童家長(zhǎng)培訓(xùn)講座
- 機(jī)動(dòng)車駕駛員考試《科目一》試題與參考答案(2024年)
- 《學(xué)前心理學(xué)》考試復(fù)習(xí)題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論