




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1Java面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)第第 7 章章 異常處理異常處理2第第7章章 異常處理異常處理7.1 7.1 異常概念異常概念7.2 7.2 異常處理異常處理7.3 7.3 人為異常的拋出與捕獲人為異常的拋出與捕獲7.4 7.4 實(shí)例實(shí)例 37.1.1 7.1.1 何謂異常何謂異常異常是程序違反了異常是程序違反了Java語言的語言的語義語義限制,限制,程序運(yùn)行時(shí)程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤。發(fā)生的錯(cuò)誤。異常會(huì)使程序的運(yùn)行流程發(fā)生改變。異常會(huì)使程序的運(yùn)行流程發(fā)生改變。7.1 異異 常常 的的 概概 念念47.1.2 異常的分類異常通常分為三類:異常通常分為三類:程序可控制的異常程序可控制的異常
2、程序不可控制的異常程序不可控制的異常人為異常人為異常57.1.3 JAVA異常類結(jié)構(gòu)與組成Java中的所有的異常類都是從中的所有的異常類都是從Throwable類類派生出來的。派生出來的。Throwable類有兩個(gè)直接子類:類有兩個(gè)直接子類:Error 程序不可控制的異常程序不可控制的異常類,只報(bào)錯(cuò)不處類,只報(bào)錯(cuò)不處理;理;Exception 程序可控制的異常程序可控制的異常類。類。可對(duì)這類可對(duì)這類錯(cuò)誤的進(jìn)行處理。錯(cuò)誤的進(jìn)行處理。6異常類的繼承關(guān)系如下:異常類的繼承關(guān)系如下:Throwable 異常類的頂層類異常類的頂層類 Error 程序不可控制異常程序不可控制異常 Exception 程序
3、可控制異常程序可控制異常 RuntimeException運(yùn)行時(shí)異常(常見)運(yùn)行時(shí)異常(常見) AWTException 圖形用戶界面異常圖形用戶界面異常 IOException 輸入輸出異常輸入輸出異常 IllegalAccessException 無法訪問類異常無法訪問類異常 ClassNotFoundException 類或接口未找到異常類或接口未找到異常 。7RuntimeExceptionRuntimeException 運(yùn)行時(shí)異常運(yùn)行時(shí)異常ArithmeticExceptionArithmeticException 算術(shù)運(yùn)算異常:如除數(shù)為算術(shù)運(yùn)算異常:如除數(shù)為0 0 ArraySt
4、oreExceptionArrayStoreException 數(shù)組存儲(chǔ)異常:欲把不同類型的值存入數(shù)組數(shù)組存儲(chǔ)異常:欲把不同類型的值存入數(shù)組NullPointerExceptionNullPointerException 空指針異常:使用一個(gè)空對(duì)象引用空指針異常:使用一個(gè)空對(duì)象引用SecurityExceptionSecurityException 安全異常:檢測(cè)到了違反安全的行為安全異常:檢測(cè)到了違反安全的行為 IllegalArgumentExceptionIllegalArgumentException 非法參數(shù)異常:用不合法的參數(shù)調(diào)用方法非法參數(shù)異常:用不合法的參數(shù)調(diào)用方法IndexO
5、utOfBoundsExceptionIndexOutOfBoundsException 下標(biāo)越界下標(biāo)越界ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界數(shù)組下標(biāo)越界 StringIndexOutOfBoundsExceptionStringIndexOutOfBoundsException 字符串下標(biāo)越界字符串下標(biāo)越界 8/ 未處理的異常(有兩個(gè)任務(wù)未處理的異常(有兩個(gè)任務(wù))public class Ex1 public static void main(String args) /下面下面sub()方法的
6、第方法的第2個(gè)參數(shù)為個(gè)參數(shù)為0時(shí)發(fā)生異常,后序語句不執(zhí)行。時(shí)發(fā)生異常,后序語句不執(zhí)行。System.out.println(sub(10,3); System.out.println(sub(10,5); static int sub (int a,int b) System.out.print(a+/+b+=); return a / b; 不發(fā)生異常時(shí)運(yùn)行結(jié)果:不發(fā)生異常時(shí)運(yùn)行結(jié)果:10/3=310/5=27.1.4 未處理的異常未處理的異常9第第5行行System.out.println(sub(10,3); 改為改為System.out.println(sub(10,0); 時(shí)的時(shí)的運(yùn)
7、行結(jié)果如下:運(yùn)行結(jié)果如下:10/0=Exception in thread main java.lang.ArithmeticException: / by zeroat Ex1.sub(Ex1.java:10)at Ex1.main(Ex1.java:5)發(fā)生異常的運(yùn)行結(jié)果發(fā)生異常的運(yùn)行結(jié)果107.2 異常處理異常處理Java異常處異常處理的回理的回溯過程溯過程AA2A1A3A21A22A31A23A32117.2.1 異常的處理異常的處理 Java提供的允許程序員自己捕獲異常、處理異常的機(jī)制: 用用 try catch finally 塊塊實(shí)現(xiàn)實(shí)現(xiàn)121、 try-catch塊 Java語
8、言中異常的捕捉語言中異常的捕捉和處理和處理是通過是通過try-catch塊來實(shí)現(xiàn)的。塊來實(shí)現(xiàn)的。 語法形式為:語法形式為: try /程序正常的流程,有可能拋出異常程序正常的流程,有可能拋出異常 catch(異常類名異常類名 異常對(duì)象名異常對(duì)象名) /可有多個(gè)可有多個(gè)catch塊塊 /異常處理異常處理 finally /可選可選 /try-catch部分代碼執(zhí)行完后,則執(zhí)行該部分代碼部分代碼執(zhí)行完后,則執(zhí)行該部分代碼 13/ 異常捕獲與處理try-catch public class Ex2 public static void main(String args) System.out.pri
9、ntln(sub(10,0); System.out.println(sub(10,5); static int sub(int a,int b) int c=0; try System.out.print(a+/+b+=); c = a / b; catch(java.lang.ArithmeticException e) System.out.println( 除數(shù)為0!+e); return c; 執(zhí)行程序運(yùn)行結(jié)果:執(zhí)行程序運(yùn)行結(jié)果:10/0= 除數(shù)為除數(shù)為0!java.lang.ArithmeticException: / by zero010/5=2141.try塊、塊、 catch
10、塊中定義的變量只在各自的代碼塊中有效,如塊中定義的變量只在各自的代碼塊中有效,如try塊塊中的中的 int c ;2.catch塊中程序執(zhí)行完成后,不返回塊中程序執(zhí)行完成后,不返回try塊中拋出異常語句或其后的塊中拋出異常語句或其后的語句繼續(xù)執(zhí)行;語句繼續(xù)執(zhí)行;3.出現(xiàn)異常的出現(xiàn)異常的方法(方法(sub())有返回值時(shí),有返回值時(shí),return語句不能加入到語句不能加入到try塊中;且必須有明確的返回值;塊中;且必須有明確的返回值;4.異常發(fā)生后未影響后續(xù)程序的執(zhí)行。異常發(fā)生后未影響后續(xù)程序的執(zhí)行。5.捕獲異常類時(shí)可用帶包名的類名,包名可省略:捕獲異常類時(shí)可用帶包名的類名,包名可省略:本例中可
11、用:本例中可用:java.lang.ArithmeticException或或ArithmeticException6.沒有匹配的異常類,則匹配失敗,如同沒有處理一樣;沒有匹配的異常類,則匹配失敗,如同沒有處理一樣;結(jié)果分析結(jié)果分析15/【例【例7.3】多個(gè)異常的處理】多個(gè)異常的處理public class Ex3 public static void main(String args) int n = 4,8,16, 0,64,128;int k = 2,0, 4, 8;for (int i=0;in.length; i+) try int d=sub(ni,ki); /發(fā)生異常的語句發(fā)生異
12、常的語句if (d!=0 | ni=0)System.out.println(d);catch(ArrayIndexOutOfBoundsException x) System.out.println(數(shù)組下標(biāo)越界!數(shù)組下標(biāo)越界!+x);System.out.println(最后一條語句!最后一條語句!);2、多個(gè)異常的處理、多個(gè)異常的處理16 static int sub(int a,int b) int c=0; try System.out.print(a+/+b+=); c = a / b; catch(java.lang.ArithmeticException e) System.o
13、ut.println( 除數(shù)為除數(shù)為0!+e); return c; 17程序執(zhí)行結(jié)果:4/2=28/0= 除數(shù)為0!java.lang.ArithmeticException: / by zero16/4=40/8=0數(shù)組下標(biāo)越界!java.lang.ArrayIndexOutOfBoundsException: 4數(shù)組下標(biāo)越界!java.lang.ArrayIndexOutOfBoundsException: 5最后一條語句!18結(jié)果分析:例7.2中的除數(shù)為0時(shí)返回為0的問題,通過語句if (d!=0 | ni=0)得以改進(jìn);該程序分別在不同的層次對(duì)兩種異常進(jìn)行了處理;異常處理后的程序保持
14、了良好的健壯性,體現(xiàn)了“帶病工作”的能力;193、 多條多條catch語句和語句和finally一起使用一起使用/多條多條catch與與finally并用,并用,sub()中不再處理異常中不再處理異常public class Ex6 public static void main(String args) int n = 4,8,16, 0,64,128;int k = 2,0, 4, 8;for (int i=0;in.length; i+)try System.out.print(ni+/+ki+=);int d=sub(ni,ki); /發(fā)生異常的語句發(fā)生異常的語句/ if (d!=0
15、| ni=0)System.out.println(d);20 catch (ArithmeticException e) System.out.println(除數(shù)為0: + e); catch (ArrayIndexOutOfBoundsException e) System.out.println(數(shù)組越界: + e); finally System.out.println(finally語句!);System.out.println(最后一條語句!); static int sub(int a,int b) return a/b; 21對(duì)于一個(gè)對(duì)于一個(gè)try塊,可以有多個(gè)塊,可以有多個(gè)
16、catch塊,每個(gè)塊,每個(gè)catch塊捕獲和處理一種異常。塊捕獲和處理一種異常。finally塊對(duì)于塊對(duì)于try-catch塊是可選的,不管塊是可選的,不管try-catch塊是否拋出、處理異常,塊是否拋出、處理異常,finally部部分總要執(zhí)行。分總要執(zhí)行。finally語句不被執(zhí)行的唯一情況是在語句不被執(zhí)行的唯一情況是在try塊內(nèi)塊內(nèi)執(zhí)行終止程序的執(zhí)行終止程序的System.exit()方法。方法。程序分析程序分析22實(shí)驗(yàn)驗(yàn)證:實(shí)驗(yàn)驗(yàn)證:如果如果 try 語句塊的最后一條語句為語句塊的最后一條語句為return時(shí),時(shí),程序先執(zhí)行程序先執(zhí)行finally語句塊,再執(zhí)行語句塊,再執(zhí)行retur
17、n語句。語句。這時(shí),如果這時(shí),如果finally語句塊中有語句塊中有return語句,則語句,則執(zhí)行完該語句就即可返回,不再執(zhí)行執(zhí)行完該語句就即可返回,不再執(zhí)行try語句塊語句塊的的return語句。語句。如果多個(gè)如果多個(gè)catch塊后的異常類有繼承關(guān)系,則塊后的異常類有繼承關(guān)系,則應(yīng)將派生類放在前面。應(yīng)將派生類放在前面。23int a = new int10;try for(int i=0;i=10;i+)ai=i; catch(ArrayIndexOutOfBoundsExeption e)System.out.println(Array Index out of Bounds); cat
18、ch(Exception e) System.out.println(There is an exception); 該程序段將輸出:該程序段將輸出:Array Index out of Bounds正確用法:正確用法:24將兩個(gè)將兩個(gè)catch塊的順序?qū)φ{(diào):塊的順序?qū)φ{(diào):int a = new int10;try for(int i=0;i10) throw new MyException(a);/ 主動(dòng)拋出MyExceptionSystem.out.println(正常返回);27public static void main(String args) try System.out.pri
19、ntln(n進(jìn)入監(jiān)控區(qū),執(zhí)行可能發(fā)生異常的程序段進(jìn)入監(jiān)控區(qū),執(zhí)行可能發(fā)生異常的程序段);method(8);method(20);method(6);catch (MyException e) System.out.println(t程序發(fā)生異常并在此處進(jìn)行處理程序發(fā)生異常并在此處進(jìn)行處理);System.out.println(t發(fā)生的異常為:發(fā)生的異常為:+e.toString();System.out.println(這里可執(zhí)行其他代碼這里可執(zhí)行其他代碼);28程序分析首先,定義自己的異常類,自定義異常是從首先,定義自己的異常類,自定義異常是從Exception類中派生的,可使用下面的聲
20、明語類中派生的,可使用下面的聲明語句來創(chuàng)建。句來創(chuàng)建。class 自定義異常名自定義異常名 extends Exception .如例如例7.5所示,創(chuàng)建了一個(gè)所示,創(chuàng)建了一個(gè)MyException異常類。異常類。29其次,異常的拋出是由其次,異常的拋出是由throw語句來實(shí)現(xiàn)的,如果語句來實(shí)現(xiàn)的,如果程序中檢測(cè)到一個(gè)錯(cuò)誤,可以創(chuàng)建一個(gè)異常對(duì)象,程序中檢測(cè)到一個(gè)錯(cuò)誤,可以創(chuàng)建一個(gè)異常對(duì)象,然后使用然后使用throw拋出。例拋出。例7.5程序中的:程序中的: throw new MyException(a);該語句直接調(diào)用該語句直接調(diào)用MyException類的構(gòu)造方法創(chuàng)建一類的構(gòu)造方法創(chuàng)建一個(gè)
21、個(gè)MyException類的對(duì)象并拋出該對(duì)象。也可利類的對(duì)象并拋出該對(duì)象。也可利用父類用父類Exception的兩個(gè)構(gòu)造方法:的兩個(gè)構(gòu)造方法:public Exception();public Exception(String msg)。根據(jù)錯(cuò)誤類型的不同,創(chuàng)建的異常對(duì)象的類型也不根據(jù)錯(cuò)誤類型的不同,創(chuàng)建的異常對(duì)象的類型也不相同。相同。30第三,如果一個(gè)方法的成員有可能拋擲異常,應(yīng)在第三,如果一個(gè)方法的成員有可能拋擲異常,應(yīng)在定義該方法時(shí)使用定義該方法時(shí)使用throws關(guān)鍵字聲明其可能拋出關(guān)鍵字聲明其可能拋出的異常種類,在方法定義的頭部加上:的異常種類,在方法定義的頭部加上: 方法頭部方法頭部
22、 throws 異常類名列表異常類名列表例例7.5程序中程序中UserException類中的方法類中的方法method的的定義:定義:static void method(int a) throws MyException這說明這說明method方法會(huì)拋出異常,但不處理異常,在方法會(huì)拋出異常,但不處理異常,在調(diào)用調(diào)用method方法的方法的main程序中要捕獲和處理它程序中要捕獲和處理它拋出的異常。否則調(diào)用程序就要異常終止。拋出的異常。否則調(diào)用程序就要異常終止。317.4 實(shí)例實(shí)例例例7.6程序演示了程序演示了try-catch和和throw語句的使用,該程序語句的使用,該程序在在Keybo
23、ardInput類中定義了兩個(gè)方法類中定義了兩個(gè)方法ReadName和和ReadAge,它們從,它們從JDK5.0以后版本新提供的控制臺(tái)標(biāo)準(zhǔn)以后版本新提供的控制臺(tái)標(biāo)準(zhǔn)輸入設(shè)備輸入設(shè)備Scanner讀取讀取String、int類型數(shù)據(jù)作為姓名和年類型數(shù)據(jù)作為姓名和年齡。并對(duì)年齡進(jìn)行判斷,若不在齡。并對(duì)年齡進(jìn)行判斷,若不在1-99之間或輸入的是非數(shù)之間或輸入的是非數(shù)字字符,則都拋出字字符,則都拋出InputMismatchException類的異常,類的異常,處理異常提示重輸。對(duì)處理異常提示重輸。對(duì)ReadName和和ReadAge方法未捕獲方法未捕獲處理的異常,拋出處理的異常,拋出Excepti
24、on異常,交由異常,交由ExceptionDemo類中的類中的main方法中進(jìn)行捕捉處理,可調(diào)用方法中進(jìn)行捕捉處理,可調(diào)用Exception類的類的方法方法getMessage獲取錯(cuò)誤信息。獲取錯(cuò)誤信息。 32/【例【例7.67.6】 異常處理實(shí)例異常處理實(shí)例import java.util.import java.util.* *; ;class KeyboardInputclass KeyboardInput String ReadNameString ReadName() throws Exception () throws Exception try/ try/ 讀入姓名字符串讀入姓名
25、字符串System.System.outout.print(.print(請(qǐng)輸入姓名:請(qǐng)輸入姓名:););Scanner in = new Scanner(System.Scanner in = new Scanner(System.inin););return in.next();return in.next();catch(Exception e)catch(Exception e)throw new Exception();throw new Exception(); 33int ReadAgeint ReadAge() throws Exception () throws Except
26、ion intint age; age;do do try try System.System.outout.print(.print(請(qǐng)輸入年齡(請(qǐng)輸入年齡(1-991-99):):););Scanner in = new Scanner(System.Scanner in = new Scanner(System.inin););age=in.nextIntage=in.nextInt();();if (0age & age100) return age;if (0age & age100) return age;else throw new InputMismatchExceptione
27、lse throw new InputMismatchException(年齡必須年齡必須在在9999以內(nèi)以內(nèi));); catch (InputMismatchException catch (InputMismatchException e) e) System.System.outout.println.println(輸入年齡錯(cuò)誤輸入年齡錯(cuò)誤(+e+),(+e+),重輸!重輸!);); while(true) ;while(true) ; 34public class ExceptionDemopublic class ExceptionDemo public static void main(String argspublic static void main(String args) ) try try KeyboardInput keyin = new Keyboa
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店物資供應(yīng)配送合同
- 體育場(chǎng)地租賃合同協(xié)議
- 家裝瓦工施工合同
- 土石土方工程施工合同
- 化糞池工程施工合同
- 工程總承包合同舉例
- 借款合同補(bǔ)充協(xié)議
- 廢石渣轉(zhuǎn)讓合同范本
- ppp項(xiàng)目政府合同范本
- 銷售代理規(guī)劃合同范本
- 直播帶崗方案
- 瓶蓋自動(dòng)封裝機(jī)的設(shè)計(jì)
- 無線局域網(wǎng)覆蓋方案
- 網(wǎng)絡(luò)安全前沿技術(shù)與未來趨勢(shì)研究
- 遼寧省沈陽市鐵西區(qū)2024屆英語三年級(jí)第二學(xué)期期中調(diào)研試題含答案
- 道路新建、改造工程招投標(biāo)書范本
- 第13課《警惕可怕的狂犬病》 課件
- 健康飲茶知識(shí)講座
- 《照明線路安裝與維護(hù)》課程標(biāo)準(zhǔn)
- 《價(jià)值流分析》課件
- 中醫(yī)春季情志養(yǎng)生知識(shí)講座
評(píng)論
0/150
提交評(píng)論