




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、chapter7:異常處理異常處理運(yùn)用try塊、catch塊和finally塊處理異常運(yùn)用多重catch塊處理異常運(yùn)用關(guān)鍵字throw和throws處理異常什么是異常? 程序中出現(xiàn)的錯(cuò)誤被稱為異常; 異??煞譃閮纱箢悾壕幾g時(shí)異常和運(yùn)行時(shí)異常; 編譯時(shí)異常一般是指語(yǔ)法錯(cuò)誤,可以通過編譯器的提示加以修正,這里我們不予討論; 運(yùn)行時(shí)異常包括:運(yùn)行錯(cuò)誤:如數(shù)組下標(biāo)越界,除數(shù)為0等;邏輯錯(cuò)誤:如年齡超過200歲等。產(chǎn)生異常的原因 產(chǎn)生異常的原因多種多樣,大致有:系統(tǒng)資源不可用:如內(nèi)存分配失敗,文件打開失敗,數(shù)據(jù)源連接失敗等等;程序控制不當(dāng):如被零除,負(fù)數(shù)開方,數(shù)組下標(biāo)越界等等。產(chǎn)生異常后的反應(yīng) 當(dāng)異常發(fā)
2、生時(shí),程序一般會(huì)作出如下反應(yīng):發(fā)生異常的部分產(chǎn)生系統(tǒng)定義的錯(cuò)誤信息;程序意外終止,并將控制權(quán)返回操作系統(tǒng);程序中所有已分配資源的狀態(tài)保持不變,這樣將會(huì)導(dǎo)致資源泄漏。 那么我們就必須對(duì)有可能產(chǎn)生的異常進(jìn)行處理。產(chǎn)生異常后的反應(yīng)(示例)public class ExceptionDemo public static void main(String args) int a = 10, b = 0, c; /這里的除數(shù)為0,將會(huì)產(chǎn)生異常 c = a / b; System.out.println(c); try塊和catch塊 try塊:一般用來(lái)監(jiān)視有可能產(chǎn)生異常的代碼部分; catch塊:當(dāng)異常產(chǎn)
3、生后,catch塊捕捉異常,并在其中對(duì)異常進(jìn)行處理。try/catch塊的一般形式try /監(jiān)視有可能發(fā)生異常的代碼段catch (異常類型) /捕獲發(fā)生的異常 /對(duì)異常進(jìn)行處理Java中的異常類異異 常常說(shuō)說(shuō) 明明Exception異常層次結(jié)構(gòu)的根類異常層次結(jié)構(gòu)的根類RuntimeException許多許多java.lang異常的基類異常的基類ArithmeticException算術(shù)異常,如:除數(shù)為算術(shù)異常,如:除數(shù)為0IllegalArgumentException方法接收到非法參數(shù)方法接收到非法參數(shù)ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越界數(shù)組下標(biāo)越界Nu
4、llPointerException訪問空引用訪問空引用ClassNotFoundException不能加載所需的類不能加載所需的類NumberFormatException字符串轉(zhuǎn)換數(shù)字失敗字符串轉(zhuǎn)換數(shù)字失敗IOExceptionI/O異常的根類異常的根類FileNotFoundException找不到文件找不到文件EOFException文件結(jié)束文件結(jié)束try/catch塊示例public class ExceptionDemo public static void main(String args) int a = 10, b = 0, c; try /監(jiān)視有可能出現(xiàn)異常的代碼段 c =
5、 a / b; System.out.println(c); catch (ArithmeticException ae) /如果出現(xiàn)異常,將被捕獲 System.out.println(除數(shù)為0。); System.out.println(程序結(jié)束。); finally塊 無(wú)論try/catch塊中發(fā)生了什么,finally塊都一定會(huì)執(zhí)行; 當(dāng)異常發(fā)生時(shí),程序可能會(huì)意外中斷,有些被占用的資源就得不到清理。finally塊可以確保執(zhí)行所有的清理工作; 無(wú)論是否發(fā)生異常,finally塊都將執(zhí)行; finally塊是可選的,可視具體情況決定是否添加; finally塊必須和try塊一起使用,不能
6、單獨(dú)存在。try/catch/finally塊示例public class ExceptionDemo public static void main(String args) int a = 10, b = 0, c; try c = a / b; System.out.println(c); catch (ArithmeticException ae) System.out.println(除數(shù)為0。); /不論是否發(fā)生異常,finally塊中的語(yǔ)句都會(huì)執(zhí)行 finally System.out.println(finally塊中的語(yǔ)句。); System.out.println(程序結(jié)束
7、。); try/catch/finally執(zhí)行流程無(wú)異常發(fā)生異常try/catch/finally應(yīng)用模型try /連接到數(shù)據(jù)庫(kù)的代碼,有可能發(fā)生異常 /對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的代碼,有可能發(fā)生異常catch (SQLException sqle) /捕獲數(shù)據(jù)庫(kù)異常 /對(duì)捕獲的異常進(jìn)行處理finally /在finally塊中執(zhí)行關(guān)閉數(shù)據(jù)庫(kù)的操作異常類體系結(jié)構(gòu)圖ExceptionArithmeticExceptionNullPointerExceptionObjectThrowableErrorSQLExceptionRuntimeExceptionNumberFormatExceptionAWTE
8、rrorThreadDeathClassNotFoundException異常類體系結(jié)構(gòu)說(shuō)明 Throwable有兩個(gè)直接子類,它們是:Error類:Error類的異常通常為內(nèi)部錯(cuò)誤,因此在正常情況下并不期望用戶程序捕獲它們;Exception類:絕大部分用戶程序應(yīng)當(dāng)捕獲的異常類的根類; 一些常用的異常類都直接或間接派生自Exception類,因此我們可以認(rèn)為絕大部分的異常都屬于Exception。異常類中的常用方法方法原型方法原型說(shuō)說(shuō) 明明String getMessage()在在Exception類中定義的方法,被繼承到所有的異常類中,用于類中定義的方法,被繼承到所有的異常類中,用于獲得與
9、異常相關(guān)的描述信息。獲得與異常相關(guān)的描述信息。void printStackTrace()在在Exception類中定義的方法,用于在控制臺(tái)上顯示有關(guān)異常的類中定義的方法,用于在控制臺(tái)上顯示有關(guān)異常的信息,不但有異常的原因,還涉及產(chǎn)生異常的代碼行。信息,不但有異常的原因,還涉及產(chǎn)生異常的代碼行。多重catch塊 有時(shí)候,在try塊中的代碼段將有可能產(chǎn)生多種不同類型的異常,而我們又需要針對(duì)不同的異常類型進(jìn)行不同的處理方式,那么我們就可以使用多重catch塊,來(lái)分別捕獲不同類型的異常。多重catch塊示例public class ExceptionDemo public static void m
10、ain(String args) int a, b, c; try /從命令行參數(shù)獲得用戶輸入的數(shù)字 a = Integer.parseInt(args0); b = Integer.parseInt(args1); c = a / b; System.out.println(c); catch (ArrayIndexOutOfBoundsException aioobe) /捕捉數(shù)組下標(biāo)越界異常 System.out.println(您沒有指定命令行參數(shù)。); catch (NumberFormatException nfe) /捕捉字符串到數(shù)字轉(zhuǎn)換異常 System.out.println
11、(您輸入的不是數(shù)字。); catch (ArithmeticException ae) /捕捉算術(shù)(除數(shù)為0)異常 System.out.println(除數(shù)為0。); catch (Exception e) /捕捉其它不可預(yù)測(cè)的異常 System.out.println(e.getMessage(); System.out.println(程序結(jié)束。); 多重catch塊的注意事項(xiàng) 雖然多重catch塊可以同時(shí)監(jiān)視多個(gè)不同類型的異常,但是try塊中一旦有某個(gè)異常產(chǎn)生,程序就會(huì)跳轉(zhuǎn)到與之異常類型最匹配的catch塊中執(zhí)行,然后執(zhí)行finally塊(如果有finally塊的話)或之后的語(yǔ)句; 也
12、就是說(shuō),多重catch塊只會(huì)捕捉到最先產(chǎn)生的異常,而不是把所有的異常全部捕捉完; 即:不論有多少個(gè)catch塊,最多只會(huì)執(zhí)行其中的一個(gè); 請(qǐng)注意catch塊的書寫順序:類層次越低的越往上寫,越高的越往下寫。多重catch塊書寫順序示例public class ExceptionDemo public static void main(String args) int a, b, c; try a = Integer.parseInt(args0); b = Integer.parseInt(args1); c = a / b; System.out.println(c); /由于Excepti
13、on類的層次最高,以下的所有異常類型都是其子類,這樣寫將會(huì)報(bào)錯(cuò) catch (Exception e) /捕捉其它不可預(yù)測(cè)的異常 System.out.println(e.getMessage(); catch (ArrayIndexOutOfBoundsException aioobe) /捕捉數(shù)組下標(biāo)越界異常 System.out.println(您沒有指定命令行參數(shù)。); catch (NumberFormatException nfe) /捕捉字符串到數(shù)字轉(zhuǎn)換異常 System.out.println(您輸入的不是數(shù)字。); catch (ArithmeticException ae)
14、 /捕捉算術(shù)(除數(shù)為0)異常 System.out.println(除數(shù)為0。); System.out.println(程序結(jié)束。); 嵌套try/catch塊 有時(shí)候,整個(gè)語(yǔ)句塊可以產(chǎn)生異常,而其中的某個(gè)部分又可能產(chǎn)生另外的異常,而我們需要分別進(jìn)行處理; 這樣,就可以通過嵌套try/catch塊來(lái)完成; 嵌套try/catch塊就是在一個(gè)try/catch塊中包含有另外的try/catch塊。嵌套try/catch塊示例public class ExceptionDemo public static void main(String args) /*外層try/catch塊*/ try S
15、ystem.out.println(傳遞的參數(shù)是: + args0); /*嵌套try/catch塊*/ try int num = Integer.parseInt(args0); System.out.println(num + 的平方是 + (num * num); catch (NumberFormatException nfe) System.out.println(您輸入的不是數(shù)字。); catch (ArrayIndexOutOfBoundsException aioobe) System.out.println(您沒有輸入命令行參數(shù)。); throw關(guān)鍵字 throw語(yǔ)句用于手
16、工拋出異常; 執(zhí)行流程將在throw語(yǔ)句后立即停止,轉(zhuǎn)而尋找與之類型相匹配的catch塊; throw語(yǔ)句的語(yǔ)法是:throw (異常類型的實(shí)例);throw語(yǔ)句示例public class ThrowDemo public static void main(String args) try int age = Integer.parseInt(args0); if (age 100) /創(chuàng)建一個(gè)異常實(shí)例,并將其手工拋出 throw (new Exception(您輸入的年齡無(wú)效。); System.out.println(您的年齡是: + age + 歲。); catch (Exceptio
17、n e) /捕捉異常 /打印出異常信息 System.out.println(e.getMessage(); 用戶自定義異常 Exception類和其子類都是系統(tǒng)內(nèi)置的異常,這些異常不一定總能捕獲程序中發(fā)生的所有異常; 有時(shí)候,我們可能要?jiǎng)?chuàng)建用戶自定義的異常類; 用戶自定義異常類應(yīng)該是Exception類的子類; 類似于:class MyException extends Exception自定義異常示例class AgeException extends Exception /用戶自定義年齡異常類 public AgeException() /構(gòu)造方法 super(年齡無(wú)效。); publi
18、c class Test public static void main(String args) try int age = Integer.parseInt(args0); if (age 100) throw (new AgeException(); /拋出自定義異常類實(shí)例 System.out.println(您的年齡是: + age + 歲。); catch (AgeException ae) /捕捉自定義異常類型 System.out.println(ae.getMessage(); /打印異常信息 throws關(guān)鍵字 如果某個(gè)函數(shù)中的代碼有可能引發(fā)異常,可以使用try/catch
19、塊進(jìn)行處理,這種處理方式成為“內(nèi)部處理”; 如果不方便在函數(shù)內(nèi)部進(jìn)行處理,也可以將異常往函數(shù)外部傳遞,這就要使用到關(guān)鍵字throws; throws用于將函數(shù)內(nèi)部產(chǎn)生的異常拋給主調(diào)函數(shù); 一般語(yǔ)法:返回值類型 函數(shù)名(參數(shù)列表) throws 異常類型 throws關(guān)鍵字示例public class Student /定義學(xué)生類 private String name; /姓名 private int age; /年齡 /其它方法,代碼略 /*為姓名賦值的方法*/ public void setName(String name) mName = name; /*為年齡賦值的方法,該方法有可能拋出異常*/ public void setAge(int age) throws AgeException if (age 100) throw (new AgeException(); age = age; /其它方法,代碼略調(diào)用帶有throws的函數(shù)1 當(dāng)調(diào)用帶有throws關(guān)鍵字的函數(shù)時(shí),則必須放在try/catch塊中進(jìn)行監(jiān)控,否則編譯器將會(huì)報(bào)錯(cuò);public class ThrowsTest public static void m
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村屋子交易合同樣本
- 中介傭金合同樣本簡(jiǎn)約樣本
- 個(gè)人電機(jī)轉(zhuǎn)讓合同樣本
- 【高三】【下學(xué)期期中】(高考前的“加速度”)家長(zhǎng)會(huì)逐字稿
- 公司注銷合同樣本
- 出租房屋協(xié)議合同標(biāo)準(zhǔn)文本
- 乙方工地材料合同樣本
- 養(yǎng)鴨子合同樣本
- 買賣沙居間合同標(biāo)準(zhǔn)文本
- 提升企業(yè)員工忠誠(chéng)度的工作思路計(jì)劃
- 2025年高考思辨作文備考之17例高級(jí)思辨素材
- 格構(gòu)梁班組合同
- 福建省泉州市20023年第29屆WMO競(jìng)賽二年級(jí)數(shù)學(xué)下學(xué)期競(jìng)賽試卷
- 2025年安全生產(chǎn)有限空間作業(yè)應(yīng)急處理能力試題集試卷
- 四川省昭覺中學(xué)高中地理 1.2 當(dāng)代環(huán)境問題的產(chǎn)生及特點(diǎn)教學(xué)實(shí)錄 新人教版選修6
- 內(nèi)蒙古赤峰山金紅嶺有色礦業(yè)有限責(zé)任公司招聘考試真題2024
- 蘇州卷-2025年中考第一次模擬考試英語(yǔ)試卷(含答案解析)
- 撬裝式承壓設(shè)備系統(tǒng)安全技術(shù)規(guī)范
- 技術(shù)經(jīng)紀(jì)人(初級(jí))考試試題(附答案)
- 2025年全國(guó)國(guó)家版圖知識(shí)競(jìng)賽題庫(kù)及答案(中小學(xué)組)
- MOOC 成長(zhǎng)中的音樂徜徉-浙江師范大學(xué) 中國(guó)大學(xué)慕課答案
評(píng)論
0/150
提交評(píng)論