![第 7 章 異常處理_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/6538daa8-fb80-4e71-8d5e-c3ab41f10a87/6538daa8-fb80-4e71-8d5e-c3ab41f10a871.gif)
![第 7 章 異常處理_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/6538daa8-fb80-4e71-8d5e-c3ab41f10a87/6538daa8-fb80-4e71-8d5e-c3ab41f10a872.gif)
![第 7 章 異常處理_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/6538daa8-fb80-4e71-8d5e-c3ab41f10a87/6538daa8-fb80-4e71-8d5e-c3ab41f10a873.gif)
![第 7 章 異常處理_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/6538daa8-fb80-4e71-8d5e-c3ab41f10a87/6538daa8-fb80-4e71-8d5e-c3ab41f10a874.gif)
![第 7 章 異常處理_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/6538daa8-fb80-4e71-8d5e-c3ab41f10a87/6538daa8-fb80-4e71-8d5e-c3ab41f10a875.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(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)行時程序運(yùn)行時發(fā)生的錯誤。發(fā)生的錯誤。異常會使程序的運(yùn)行流程發(fā)生改變。異常會使程序的運(yùn)行流程發(fā)生改變。7.1 異異 常常 的的 概概 念念47.1.2 異常的分類異常通常分為三類:異常通常分為三類:程序可控制的異常程序可控制的異常
2、程序不可控制的異常程序不可控制的異常人為異常人為異常57.1.3 JAVA異常類結(jié)構(gòu)與組成Java中的所有的異常類都是從中的所有的異常類都是從Throwable類類派生出來的。派生出來的。Throwable類有兩個直接子類:類有兩個直接子類:Error 程序不可控制的異常程序不可控制的異常類,只報(bào)錯不處類,只報(bào)錯不處理;理;Exception 程序可控制的異常程序可控制的異常類。類??蓪@類可對這類錯誤的進(jìn)行處理。錯誤的進(jìn)行處理。6異常類的繼承關(guān)系如下:異常類的繼承關(guān)系如下:Throwable 異常類的頂層類異常類的頂層類 Error 程序不可控制異常程序不可控制異常 Exception 程序
3、可控制異常程序可控制異常 RuntimeException運(yùn)行時異常(常見)運(yùn)行時異常(常見) AWTException 圖形用戶界面異常圖形用戶界面異常 IOException 輸入輸出異常輸入輸出異常 IllegalAccessException 無法訪問類異常無法訪問類異常 ClassNotFoundException 類或接口未找到異常類或接口未找到異常 。7RuntimeExceptionRuntimeException 運(yùn)行時異常運(yùn)行時異常ArithmeticExceptionArithmeticException 算術(shù)運(yùn)算異常:如除數(shù)為算術(shù)運(yùn)算異常:如除數(shù)為0 0 ArraySt
4、oreExceptionArrayStoreException 數(shù)組存儲異常:欲把不同類型的值存入數(shù)組數(shù)組存儲異常:欲把不同類型的值存入數(shù)組NullPointerExceptionNullPointerException 空指針異常:使用一個空對象引用空指針異常:使用一個空對象引用SecurityExceptionSecurityException 安全異常:檢測到了違反安全的行為安全異常:檢測到了違反安全的行為 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/ 未處理的異常(有兩個任務(wù)未處理的異常(有兩個任務(wù))public class Ex1 public static void main(String args) /下面下面sub()方法的
6、第方法的第2個參數(shù)為個參數(shù)為0時發(fā)生異常,后序語句不執(zhí)行。時發(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ā)生異常時運(yùn)行結(jié)果:不發(fā)生異常時運(yùn)行結(jié)果:10/3=310/5=27.1.4 未處理的異常未處理的異常9第第5行行System.out.println(sub(10,3); 改為改為System.out.println(sub(10,0); 時的時的運(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(異常類名異常類名 異常對象名異常對象名) /可有多個可有多個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())有返回值時,有返回值時,return語句不能加入到語句不能加入到try塊中;且必須有明確的返回值;塊中;且必須有明確的返回值;4.異常發(fā)生后未影響后續(xù)程序的執(zhí)行。異常發(fā)生后未影響后續(xù)程序的執(zhí)行。5.捕獲異常類時可用帶包名的類名,包名可省略:捕獲異常類時可用帶包名的類名,包名可省略:本例中可
11、用:本例中可用:java.lang.ArithmeticException或或ArithmeticException6.沒有匹配的異常類,則匹配失敗,如同沒有處理一樣;沒有匹配的異常類,則匹配失敗,如同沒有處理一樣;結(jié)果分析結(jié)果分析15/【例【例7.3】多個異常的處理】多個異常的處理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、多個異常的處理、多個異常的處理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時返回為0的問題,通過語句if (d!=0 | ni=0)得以改進(jìn);該程序分別在不同的層次對兩種異常進(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對于一個對于一個try塊,可以有多個塊,可以有多個
16、catch塊,每個塊,每個catch塊捕獲和處理一種異常。塊捕獲和處理一種異常。finally塊對于塊對于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時,時,程序先執(zhí)行程序先執(zhí)行finally語句塊,再執(zhí)行語句塊,再執(zhí)行retur
17、n語句。語句。這時,如果這時,如果finally語句塊中有語句塊中有return語句,則語句,則執(zhí)行完該語句就即可返回,不再執(zhí)行執(zhí)行完該語句就即可返回,不再執(zhí)行try語句塊語句塊的的return語句。語句。如果多個如果多個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將兩個將兩個catch塊的順序?qū)φ{(diào):塊的順序?qū)φ{(diào):int a = new int10;try for(int i=0;i10) throw new MyException(a);/ 主動拋出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)建了一個所示,創(chuàng)建了一個MyException異常類。異常類。29其次,異常的拋出是由其次,異常的拋出是由throw語句來實(shí)現(xiàn)的,如果語句來實(shí)現(xiàn)的,如果程序中檢測到一個錯誤,可以創(chuàng)建一個異常對象,程序中檢測到一個錯誤,可以創(chuàng)建一個異常對象,然后使用然后使用throw拋出。例拋出。例7.5程序中的:程序中的: throw new MyException(a);該語句直接調(diào)用該語句直接調(diào)用MyException類的構(gòu)造方法創(chuàng)建一類的構(gòu)造方法創(chuàng)建一個
21、個MyException類的對象并拋出該對象。也可利類的對象并拋出該對象。也可利用父類用父類Exception的兩個構(gòu)造方法:的兩個構(gòu)造方法:public Exception();public Exception(String msg)。根據(jù)錯誤類型的不同,創(chuàng)建的異常對象的類型也不根據(jù)錯誤類型的不同,創(chuàng)建的異常對象的類型也不相同。相同。30第三,如果一個方法的成員有可能拋擲異常,應(yīng)在第三,如果一個方法的成員有可能拋擲異常,應(yīng)在定義該方法時使用定義該方法時使用throws關(guān)鍵字聲明其可能拋出關(guān)鍵字聲明其可能拋出的異常種類,在方法定義的頭部加上:的異常種類,在方法定義的頭部加上: 方法頭部方法頭部
22、 throws 異常類名列表異常類名列表例例7.5程序中程序中UserException類中的方法類中的方法method的的定義:定義:static void method(int a) throws MyException這說明這說明method方法會拋出異常,但不處理異常,在方法會拋出異常,但不處理異常,在調(diào)用調(diào)用method方法的方法的main程序中要捕獲和處理它程序中要捕獲和處理它拋出的異常。否則調(diào)用程序就要異常終止。拋出的異常。否則調(diào)用程序就要異常終止。317.4 實(shí)例實(shí)例例例7.6程序演示了程序演示了try-catch和和throw語句的使用,該程序語句的使用,該程序在在Keybo
23、ardInput類中定義了兩個方法類中定義了兩個方法ReadName和和ReadAge,它們從,它們從JDK5.0以后版本新提供的控制臺標(biāo)準(zhǔn)以后版本新提供的控制臺標(biāo)準(zhǔn)輸入設(shè)備輸入設(shè)備Scanner讀取讀取String、int類型數(shù)據(jù)作為姓名和年類型數(shù)據(jù)作為姓名和年齡。并對年齡進(jìn)行判斷,若不在齡。并對年齡進(jìn)行判斷,若不在1-99之間或輸入的是非數(shù)之間或輸入的是非數(shù)字字符,則都拋出字字符,則都拋出InputMismatchException類的異常,類的異常,處理異常提示重輸。對處理異常提示重輸。對ReadName和和ReadAge方法未捕獲方法未捕獲處理的異常,拋出處理的異常,拋出Excepti
24、on異常,交由異常,交由ExceptionDemo類中的類中的main方法中進(jìn)行捕捉處理,可調(diào)用方法中進(jìn)行捕捉處理,可調(diào)用Exception類的類的方法方法getMessage獲取錯誤信息。獲取錯誤信息。 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(請輸入姓名:請輸入姓名:););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(請輸入年齡(請輸入年齡(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(輸入年齡錯誤輸入年齡錯誤(+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等.壓縮文件請下載最新的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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深度解析醫(yī)療垃圾處理中的生態(tài)修復(fù)技術(shù)應(yīng)用
- 生產(chǎn)數(shù)據(jù)在醫(yī)療設(shè)備研發(fā)中的應(yīng)用分析
- 班組成員職業(yè)技能培訓(xùn)效果評估方法
- 2025年南京貨運(yùn)上崗證考試考哪些科目
- 2025年昆明道路運(yùn)輸從業(yè)資格證考試內(nèi)容是什么
- 2025年石家莊貨運(yùn)從業(yè)考試試題及答案詳解
- 2025年梧州貨運(yùn)資格證模擬考試題庫
- 2025年南寧貨運(yùn)資格證繼續(xù)教育模擬考試
- 電子商務(wù)平臺服務(wù)支持與用戶體驗(yàn)關(guān)系研究
- 現(xiàn)代企業(yè)管理戰(zhàn)略的跨文化適應(yīng)性
- 足球場建設(shè)項(xiàng)目設(shè)計(jì)方案
- 兒童四宮格數(shù)獨(dú)96題-(由簡到難,支持打印)
- 2024-2030年傷口護(hù)理管理行業(yè)市場現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評估規(guī)劃分析研究分析報(bào)告
- 國家中醫(yī)藥管理局發(fā)布的406種中醫(yī)優(yōu)勢病種診療方案和臨床路徑目錄
- 混凝土攪拌站安全生產(chǎn)風(fēng)險(xiǎn)分級管控體系方案全套資料2021-2022完整實(shí)施方案模板
- 新生兒紅臀的預(yù)防和護(hù)理
- 《停車場規(guī)劃設(shè)計(jì)規(guī)范》
- eras在婦科圍手術(shù)
- 膝關(guān)節(jié)前十字韌帶扭傷查房
- 2024建設(shè)工程人工材料設(shè)備機(jī)械數(shù)據(jù)分類和編碼規(guī)范
- 倉庫高位貨架管理制度培訓(xùn)課件
評論
0/150
提交評論