11-Java異常處理機制_第1頁
11-Java異常處理機制_第2頁
11-Java異常處理機制_第3頁
11-Java異常處理機制_第4頁
11-Java異常處理機制_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、JAVA編程精要Java異常處理機制福建 廈門2014年6月本章目標本章目標理解異常的概念運用try塊、catch塊和finally塊處理異常Java中異常類的繼承體系結構運用多重catch塊處理異常運用嵌套try/catch塊處理異常運用關鍵字throw和throws處理異常用戶自定義異常本章相關詞匯本章相關詞匯單單 詞詞說說 明明try監(jiān)視,考驗,審問監(jiān)視,考驗,審問,嘗試嘗試catch捕捉,捕獲捕捉,捕獲finally最后,終于,不可更改地最后,終于,不可更改地throw拋出,扔拋出,扔throws拋出,扔拋出,扔exception異常異常error錯誤錯誤異常處理異常處理運用try塊、

2、catch塊和finally塊處理異常運用多重catch塊處理異常運用關鍵字throw和throws處理異常異常概述異常概述程序中出現(xiàn)的錯誤被稱為異常異常可分為兩大類:編譯時異常和運行時異常編譯時異常一般是指語法錯誤,可以通過編譯器的提示加以修正,這里我們不予討論運行時異常包括:運行錯誤:如數(shù)組下標越界,除數(shù)為0等邏輯錯誤:如年齡超過200歲等產(chǎn)生異常的原因產(chǎn)生異常的原因產(chǎn)生異常的原因多種多樣,大致有:系統(tǒng)資源不可用:如內(nèi)存分配失敗,文件打開失敗,數(shù)據(jù)源連接失敗等等程序控制不當:如被零除,負數(shù)開方,數(shù)組下標越界等等產(chǎn)生異常后的反應產(chǎn)生異常后的反應當異常發(fā)生時,程序一般會作出如下反應:發(fā)生異常的

3、部分產(chǎn)生系統(tǒng)定義的錯誤信息程序意外終止,并將控制權返回操作系統(tǒng)那么我們就必須對有可能產(chǎn)生的異常進行處理產(chǎn)生異常后的反應產(chǎn)生異常后的反應public class ExceptionDemo public static void main(String args) int a = 10, b = 0, c; /這里的除數(shù)為這里的除數(shù)為0,將會產(chǎn)生異常,將會產(chǎn)生異常 c = a / b; System.out.println(c); trytry塊和塊和catchcatch塊塊try塊:一般用來監(jiān)視有可能產(chǎn)生異常的代碼部分catch塊:當異常產(chǎn)生后,catch塊捕捉異常,并在其中對異常進行處理try

4、/catchtry/catch塊的一般形式塊的一般形式try /監(jiān)視有可能發(fā)生異常的代碼段監(jiān)視有可能發(fā)生異常的代碼段catch (異常類型異常類型) /捕獲發(fā)生的異常捕獲發(fā)生的異常 /對異常進行處理對異常進行處理JavaJava中的異常類中的異常類異異 常常說說 明明Exception異常層次結構的根類異常層次結構的根類RuntimeException許多許多java.lang異常的異常的基類基類ArithmeticException算術異常,如:除數(shù)為算術異常,如:除數(shù)為0IllegalArgumentException方法接收到非法參數(shù)方法接收到非法參數(shù)ArrayIndexOutOfBou

5、ndsException數(shù)組下標越界數(shù)組下標越界NullPointerException訪問空引用訪問空引用ClassNotFoundException不能加載所需的類不能加載所需的類NumberFormatException字符串轉換數(shù)字失敗字符串轉換數(shù)字失敗JavaJava中的異常類中的異常類異異 常常說說 明明IOExceptionI/O異常的根類異常的根類FileNotFoundException找不到文件找不到文件EOFException文件結束文件結束try/catchtry/catch塊示例塊示例public class ExceptionDemo public static v

6、oid main(String args) int a = 10, b = 0, c; try /監(jiān)視有可能出現(xiàn)異常的代碼段監(jiān)視有可能出現(xiàn)異常的代碼段 c = a / b; System.out.println(c); catch (ArithmeticException ae) /捕獲異常捕獲異常 System.out.println(除數(shù)為除數(shù)為0。); System.out.println(程序結束。程序結束。); finallyfinally塊塊無論try/catch塊中發(fā)生了什么,finally塊都一定會執(zhí)行當異常發(fā)生時,程序可能會意外中斷,有些被占用的資源就得不到清理。finall

7、y塊可以確保執(zhí)行所有的清理工作無論是否發(fā)生異常,finally塊都將執(zhí)行finally塊是可選的,可視具體情況決定是否添加 finally塊必須和try塊一起使用,不能單獨存在try/catch/finallytry/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.printl

8、n(除數(shù)為除數(shù)為0。); /不論是否發(fā)生異常,不論是否發(fā)生異常,finally塊中的語句都會執(zhí)行塊中的語句都會執(zhí)行 finally System.out.println(finally塊中的語句。塊中的語句。); try/catch/finallytry/catch/finally執(zhí)行流程執(zhí)行流程無異常無異常發(fā)生異常發(fā)生異常try/catch/finallytry/catch/finally應用模型應用模型try /連接到數(shù)據(jù)庫的代碼,有可能發(fā)生異常 /對數(shù)據(jù)庫進行操作的代碼,有可能發(fā)生異常catch (SQLException sqle) /捕獲數(shù)據(jù)庫異常 /對捕獲的異常進行處理finall

9、y /在finally塊中執(zhí)行關閉數(shù)據(jù)庫的操作異常類體系結構圖異常類體系結構圖ExceptionArithmeticExceptionNullPointerExceptionObjectThrowableErrorSQLExceptionRuntimeExceptionNumberFormatExceptionAWTErrorThreadDeathClassNotFoundException異常類體系結構說明異常類體系結構說明Throwable有兩個直接子類,它們是:Error類:Error類的異常通常為內(nèi)部錯誤,因此在正常情況下并不期望用戶程序捕獲它們Exception類:絕大部分用戶程序應

10、當捕獲的異常類的根類一些常用的異常類都直接或間接派生自Exception類,因此我們可以認為絕大部分的異常都屬于Exception異常類中的常用方法異常類中的常用方法方法原型方法原型說說 明明String getMessage()在在Exception類中定義的方法,被繼類中定義的方法,被繼承到所有的異常類中,用于獲得與承到所有的異常類中,用于獲得與異常相關的描述信息。異常相關的描述信息。void printStackTrace()在在Exception類中定義的方法,用于類中定義的方法,用于在控制臺上顯示有關異常的信息,在控制臺上顯示有關異常的信息,不但有異常的原因,還涉及產(chǎn)生異不但有異常的

11、原因,還涉及產(chǎn)生異常的代碼行。常的代碼行。多重多重catchcatch塊塊有時候,在try塊中的代碼段將有可能產(chǎn)生多種不同類型的異常,而我們又需要針對不同的異常類型進行不同的處理方式,那么我們就可以使用多重catch塊,來分別捕獲不同類型的異常try c = a / b; System.out.println(c);catch (ArrayIndexOutOfBoundsException aioobe) /下標越界下標越界 System.out.println(您沒有指定命令行參數(shù)。您沒有指定命令行參數(shù)。);catch (NumberFormatException nfe) /字符串到數(shù)字轉

12、換異常字符串到數(shù)字轉換異常 System.out.println(您輸入的不是數(shù)字。您輸入的不是數(shù)字。);catch (ArithmeticException ae) /算術(除數(shù)為算術(除數(shù)為0)異常)異常 System.out.println(除數(shù)為除數(shù)為0。);catch (Exception e) /其它不可預測的異常其它不可預測的異常 System.out.println(e.getMessage();多重多重catchcatch塊的注意事項塊的注意事項雖然多重catch塊可以同時監(jiān)視多個不同類型的異常,但是try塊中一旦有某個異常產(chǎn)生,程序就會跳轉到與之異常類型最匹配的catch塊

13、中執(zhí)行,然后執(zhí)行finally塊(如果有finally塊的話)或之后的語句也就是說,多重catch塊只會捕捉到最先產(chǎn)生的異常,而不是把所有的異常全部捕捉完;即:不論有多少個catch塊,最多只會執(zhí)行其中的一個請注意catch塊的書寫順序:類層次越低的越往上寫,越高的越往下寫try catch (Exception e) /其它不可預測的異常其它不可預測的異常 System.out.println(e.getMessage();catch (ArrayIndexOutOfBoundsException aioobe) /下標越界下標越界 System.out.println(您沒有指定命令行參數(shù)

14、。您沒有指定命令行參數(shù)。);catch (NumberFormatException nfe) /字符串到數(shù)字轉換異常字符串到數(shù)字轉換異常 System.out.println(您輸入的不是數(shù)字。您輸入的不是數(shù)字。);catch (ArithmeticException ae) /算術(除數(shù)為算術(除數(shù)為0)異常)異常 System.out.println(除數(shù)為除數(shù)為0。);多重多重catchcatch塊書寫順序示例塊書寫順序示例Exception類的層次最高,以下的所有異常類型都是其子類,這樣寫將會報錯嵌套嵌套try/catchtry/catch塊塊有時候,整個語句塊可以產(chǎn)生異常,而其中的

15、某個部分又可能產(chǎn)生另外的異常,而我們需要分別進行處理這樣,就可以通過嵌套try/catch塊來完成嵌套try/catch塊就是在一個try/catch塊中包含有另外的try/catch塊嵌套嵌套try/catchtry/catch塊示例塊示例/*外層外層try/catch塊塊*/try System.out.println(傳遞的參數(shù)是:傳遞的參數(shù)是: + args0); /*嵌套嵌套try/catch塊塊*/ try int num = Integer.parseInt(args0); System.out.println(num + 的平方是的平方是 + (num * num); catc

16、h (NumberFormatException nfe) System.out.println(您輸入的不是數(shù)字。您輸入的不是數(shù)字。); catch (ArrayIndexOutOfBoundsException aioobe) System.out.println(您沒有輸入命令行參數(shù)。您沒有輸入命令行參數(shù)。);throwthrow關鍵字關鍵字throw語句用于手工拋出異常;執(zhí)行流程將在throw語句后立即停止,轉而尋找與之類型相匹配的catch塊throw語句的語法是throw (異常類型的實例);throwthrow語句示例語句示例try . if (age 100) /創(chuàng)建一個異常實

17、例,并將其手工拋出創(chuàng)建一個異常實例,并將其手工拋出 throw (new Exception(您輸入的年齡無效。您輸入的年齡無效。); System.out.println(您的年齡是:您的年齡是: + age + 歲歲); catch (Exception e) /捕捉異常捕捉異常 /打印出異常信息打印出異常信息 System.out.println(e.getMessage();用戶自定義異常用戶自定義異常Exception類和其子類都是系統(tǒng)內(nèi)置的異常,這些異常不一定總能捕獲程序中發(fā)生的所有異常;有時候,我們可能要創(chuàng)建用戶自定義的異常類;用戶自定義異常類應該是Exception類的子類;類

18、似于:class MyException extends Exception 自定義異常示例自定義異常示例/用戶自定義年齡異常類用戶自定義年齡異常類class AgeException extends Exception public AgeException() /構造方法構造方法 super(年齡無效年齡無效); 自定義異常示例自定義異常示例public class Test public static void main(String args) try int age = Integer.parseInt(args0); if (age 100) throw (new AgeExcep

19、tion(); /拋出自定義異常拋出自定義異常 System.out.println(您的年齡是:您的年齡是: + age + 歲。歲。); catch (AgeException ae) /捕捉自定義異常捕捉自定義異常 System.out.println(ae.getMessage(); /打印異常信息打印異常信息 throwsthrows關鍵字關鍵字如果某個函數(shù)中的代碼有可能引發(fā)異常,可以使用try/catch塊進行處理,這種處理方式成為“內(nèi)部處理”如果不方便在函數(shù)內(nèi)部進行處理,也可以將異常往函數(shù)外部傳遞,這就要使用到關鍵字throwsthrows用于將函數(shù)內(nèi)部產(chǎn)生的異常拋給主調(diào)函數(shù)一般

20、語法:返回值類型 函數(shù)名(參數(shù)列表) throws 異常類型 throwsthrows關鍵字示例關鍵字示例 /*為年齡賦值的方法,該方法有可能拋出異常為年齡賦值的方法,該方法有可能拋出異常*/public void setAge(int age) throws AgeException if (age 100) throw (new AgeException(); age = age; 調(diào)用帶有調(diào)用帶有throwsthrows的函數(shù)的函數(shù)當調(diào)用帶有throws關鍵字的函數(shù)時,必須進行異常處理,否則編譯器將會報錯try std.setName(zhangsan); /該方法可能會拋出異常,必須處理該方法可能會拋出異常,必須處理 std.setAge(24); std.display(); catch (AgeException ae) System.out

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論