第五章Java的異常處理_第1頁
第五章Java的異常處理_第2頁
第五章Java的異常處理_第3頁
第五章Java的異常處理_第4頁
第五章Java的異常處理_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章Java的異常處理 第五章第五章 Java的異常處理的異常處理 第五章Java的異常處理 為什么要異常處理? v對于任何語言的程序設(shè)計而言,錯誤的發(fā)生總是不可避免的對于任何語言的程序設(shè)計而言,錯誤的發(fā)生總是不可避免的. . v比如說: v 用戶輸入出錯 v 所需文件找不到 v 運行時磁盤空間不夠 v 內(nèi)存耗盡無法進行類的實例化內(nèi)存耗盡無法進行類的實例化 v 算術(shù)運算錯 (數(shù)的溢出,被零除) v 數(shù)組下標(biāo)越界 JVMJVM崩潰崩潰 v v 當(dāng)Java程序出現(xiàn)以上的錯誤時,就會在所處的方法中產(chǎn)生一個異 常對象。這個異常對象包括錯誤的類型,錯誤出現(xiàn)時程序的運行狀態(tài)以 及對該錯誤的詳細描述。下面

2、我們先看一個簡單的例子。 第五章Java的異常處理 v例5.1 vpublic class ExceptionDemo v public static void main(String args) v int x=100; v System.out.println(The result is+x/10); v System.out.println(Divided by zero: +x/0); 第五章Java的異常處理 v當(dāng)我們對其編譯后運行時,其對應(yīng)的結(jié) 果如下: v其意思是說,本程序執(zhí)行到語句“System.out.println (Divided by zero: +x/0)”時,系統(tǒng)會

3、拋出一個例外, 該例外在Java中定義為Arithmetic Exception (即屬于 算術(shù)運算例外)。 c:jbuilder3javabinjava Exception Demo The result is10 Exception in thread main java.lang.Arithmetic Exception: / by zero at Exception Demo.main(Exception Demo.java:5) 第五章Java的異常處理 5.1 什么是異常 v異常(異常(ExceptionException)又稱為例外,是指在程序)又稱為例外,是指在程序 運行過程中

4、發(fā)生的非正常事件,它會運行過程中發(fā)生的非正常事件,它會中斷指 令的正常執(zhí)行,影響程序的正常運行。影響程序的正常運行。 第五章Java的異常處理 異常對象 v在在JavaJava語言中,我們用異常對象來表示不同語言中,我們用異常對象來表示不同 的異常。的異常。 v所謂所謂JavaJava異常對象就是一個存放著相關(guān)錯誤異常對象就是一個存放著相關(guān)錯誤 信息的對象,如果方法運行時產(chǎn)生了異常,信息的對象,如果方法運行時產(chǎn)生了異常, 該方法就可以拋出一個異常對象該方法就可以拋出一個異常對象 v為了表示不同種類的異常,為了表示不同種類的異常,JavaJava語言中定義語言中定義 了許多異常類。了許多異常類。

5、 第五章Java的異常處理 v異常處理的一般步驟: 異常拋出異常拋出異常捕獲異常捕獲異常處理異常處理 5.2 異常處理機制 第五章Java的異常處理 異常處理機制 v在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常 事件,就會生成一個異常對象。 v生成的異常對象將傳遞給Java運行時系統(tǒng), 這一異常的產(chǎn)生和提交過程稱為拋出(throw) 異常。 第五章Java的異常處理 異常處理機制 v當(dāng)Java運行時系統(tǒng)得到一個異常對象時,它 將會尋找處理這一異常的代碼。找到能夠處 理這種類型的異常的方法后,運行時系統(tǒng)把 當(dāng)前異常對象交給這個方法進行處理,這一 過程稱為捕獲(catch)異常。 v如果Java運行

6、時系統(tǒng)找不到可以捕獲異常的 方法,則運行時系統(tǒng)將終止,相應(yīng)的Java程 序也將退出。 第五章Java的異常處理 方法的調(diào)用堆棧 main()main() methodA()methodA() methodB()methodB() methodC()methodC() 調(diào)調(diào) 用 用 vJavaJava程序在執(zhí)行的過程中,形成了一個先進后出的程序在執(zhí)行的過程中,形成了一個先進后出的 調(diào)用堆棧,各方法之間依照調(diào)用先后的不同,由先調(diào)用堆棧,各方法之間依照調(diào)用先后的不同,由先 至后的進入調(diào)用堆棧,堆棧的最上層即是當(dāng)前被調(diào)至后的進入調(diào)用堆棧,堆棧的最上層即是當(dāng)前被調(diào) 用執(zhí)行的方法。該方法執(zhí)行完畢后,會將處

7、理器控用執(zhí)行的方法。該方法執(zhí)行完畢后,會將處理器控 制權(quán)交還給調(diào)用他的方法,依此類推。制權(quán)交還給調(diào)用他的方法,依此類推。 第五章Java的異常處理 方法調(diào)用堆棧中異常對象的傳遞 v當(dāng)某一方法中的一個語句拋出一個異常時,如果該方法中沒當(dāng)某一方法中的一個語句拋出一個異常時,如果該方法中沒 有處理該異常的語句,那么該方法就會中止執(zhí)行,并將這個有處理該異常的語句,那么該方法就會中止執(zhí)行,并將這個 異常傳遞給堆棧中的下一層方法,直到某一方法中含有處理異常傳遞給堆棧中的下一層方法,直到某一方法中含有處理 該異常的語句為止。如果該異常被傳遞至主方法,而主方法該異常的語句為止。如果該異常被傳遞至主方法,而主方

8、法 中仍然沒有處理該異常的語句,則異常將會被拋至中仍然沒有處理該異常的語句,則異常將會被拋至JVM,程,程 序中斷。序中斷。 main()main() methodA()methodA() methodB()B() methodC()C() 調(diào)調(diào) 用 用 傳傳 遞 遞 第五章Java的異常處理 例 程 public class ExampleOfException String lines = The first line, The second line,The last line; public static void main (String args) ExampleOfExcepti

9、on eoe = new ExampleOfException(); eoe.methodA(); System.out.println(Program finished.); void methodA() methodB(); void methodB() methodC(); void methodC() for (int i=0; i4; i+) System.out.println (linesi); The first line The second line The last line Exception in thread main java.lang.ArrayIndexOut

10、OfBoundsException: 3 at ExampleOfException.methodC(ExampleOfException.java:16) at ExampleOfException.methodB(ExampleOfException.java:12) at ExampleOfException.methodA(ExampleOfException.java:9) at ExampleOfException.main(ExampleOfException.java:6) 第五章Java的異常處理 Java中的異常類 v在在JavaJava語言中,任何的異常對象都是語言中,任

11、何的異常對象都是ThrowableThrowable類的類的 直接子類或間接子類的實例。直接子類或間接子類的實例。JavaJava的類庫已經(jīng)提供的類庫已經(jīng)提供 了一些常見的異常類,如果這些異常類不能夠滿足了一些常見的異常類,如果這些異常類不能夠滿足 要求,用戶也可以創(chuàng)建自己的異常類。要求,用戶也可以創(chuàng)建自己的異常類。 第五章Java的異常處理 AWTException Throwable Error Exception RuntimeException IOException LinkageError VirtualMachineError AWTErrorArithmeticExceptio

12、n IndexOutOfBounds. InterruptedException EOFException . . . . 第五章Java的異常處理 異常(Throwable)分類 vError 動態(tài)鏈接失敗,虛擬機錯誤等,通常Java程序不 應(yīng)該捕獲這類異常,也不會拋出這種異常。 vException 運行時異常 繼承于RuntimeException。Java編譯器允許程 序不對它們做出處理。 非運行時異常 除了運行時異常之外的其他由Exception繼承 來的異常類。Java編譯器要求程序必須捕獲或 者聲明拋出這種異常。 第五章Java的異常處理 Error類 vErrorError類表

13、示類表示JavaJava運行時產(chǎn)生的系統(tǒng)內(nèi)部錯運行時產(chǎn)生的系統(tǒng)內(nèi)部錯 誤或資源耗盡等嚴重錯誤。誤或資源耗盡等嚴重錯誤。 v這種錯誤通常是程序無法控制和解決的,如這種錯誤通常是程序無法控制和解決的,如 果發(fā)生這種錯誤,通常的做法是通知用戶并果發(fā)生這種錯誤,通常的做法是通知用戶并 中止程序的執(zhí)行。中止程序的執(zhí)行。 第五章Java的異常處理 典型的錯誤類 vNoClassDefFoundError vOutOfMemoryError vVirtualMachineError v。 第五章Java的異常處理 表5.1 Java常見錯誤列表 類 名功 能 描 述 ClassCircularityErro

14、r初始化某類檢測到類的循環(huán)調(diào)用錯誤 ClassFormatError非法類格式錯誤 IllegalAccessError非法訪問錯誤 IncompatibleClassChan gError 非兼容類更新錯誤 InternalError系統(tǒng)內(nèi)部錯誤 LinkageError鏈接錯誤 NoClassDefFoundError運行系統(tǒng)找不到被引用類的定義 第五章Java的異常處理 NoSuchFieldError找不到指定域錯誤 NoSuchMethodError所調(diào)用的方法不存在 OutofMemoryError內(nèi)存不足錯誤 UnknownError系統(tǒng)無法確認的錯誤 UnsatisfiedLi

15、nkError定義為本地的方法運行時與另外的例程相連接 錯誤 VerifyError代碼校驗錯誤 VirtualMachineError虛擬機出錯,可能JVM錯或資源不足 InstantiationError企圖實例化一個接口或抽象類的錯誤 第五章Java的異常處理 Exception類 vExceptionException的子類表示了不同類型的異常,例的子類表示了不同類型的異常,例 如如RuntimeExceptionRuntimeException表示運行時異常,而表示運行時異常,而 IOExceptionIOException表示表示I/OI/O問題引起的異常。問題引起的異常。 v這些

16、子類也可以被繼承以對不同類型的異常這些子類也可以被繼承以對不同類型的異常 進行細分,如進行細分,如RuntimeExceptionRuntimeException還可細分為還可細分為 NullPointerExceptionNullPointerException、 ArithmeticExceptionArithmeticException等;等;IOExceptionIOException還可還可 細分為、細分為、EOFExceptionEOFException等。等。 第五章Java的異常處理 典型的異常類 vArithmeticException vArrayIndexOutOfBan

17、dsException vIOException vNullPointerException vNumberFormatException 第五章Java的異常處理 表5.2 Java常見的一般異常列表 類 名功 能 描 述 IllegalAccessException非法訪問異常 ClassNotFoundException指定類或接口不存在異常 CloneNotSupportException對象使用clone方法而不實現(xiàn)cloneable接口 IOException輸入/輸出異常 InterruptedIOException中斷輸入/輸出操作異常 第五章Java的異常處理 Interru

18、ptedException中斷異常(常常應(yīng)用于線程操作中) EOFException輸入流中遇到非正常的EOF標(biāo)志 指定文件找不到 MalformedURLExceptionURL格式不正確 ProtocolException網(wǎng)絡(luò)協(xié)議異常 SocketExceptionSocket操作異常 UnknownHostException給定的服務(wù)器地址無法解析 UnknownServiceException網(wǎng)絡(luò)請求服務(wù)出錯 UTFDataFormatExceptionUTF格式字符串轉(zhuǎn)換出錯 InstantiationException企圖實例化接口或抽象類 NoSuchMethodExceptio

19、n找不到指定的方法 第五章Java的異常處理 表5.3 Java常見的運行異常列表 類 名功 能 描 述 ArithmeticException算術(shù)運算除數(shù)為零 IndexOutofBoundException下標(biāo)越界錯誤 ArrayIndexOutofBoundsExceptio n 數(shù)組元素下標(biāo)越界錯誤 StringIndexOutofBoundsExcepti on 字符串下標(biāo)越界錯誤 ClassCastException類型強制轉(zhuǎn)換異常 NegativeArraySizeException數(shù)組的長度為負異常 NullPointerException非法使用空指針異常 第五章Java的異

20、常處理 NumberFormatException非法數(shù)據(jù)格式異常 IllegalArgumentException非法參數(shù)異常 IllegalMonitorStateException非法監(jiān)視器操作異常 IllegalThreadStateException非法線程狀態(tài)異常 EmptyStackException??债惓?,對空棧進行操作 NoSuchElementException枚舉對象不存在給定的元素異常 SecurityException安全性異常 第五章Java的異常處理 必檢異常與非必檢異常 vRuntimeExceptionRuntimeException類及其子類被稱為類及其子

21、類被稱為“運行運行 時異常時異?!?一般發(fā)生在一般發(fā)生在JREJRE內(nèi)部內(nèi)部 也稱也稱“非必檢異常非必檢異?!?如如NullPointerExceptionNullPointerException v其他異常被成為其他異常被成為“非運行時異常非運行時異?!?一般發(fā)生在一般發(fā)生在JREJRE外部外部 也稱也稱“必檢異常必檢異?!?如如IOExceptionIOException 第五章Java的異常處理 5.3 異常類的使用 v要捕獲一個異常,程序員只需要在程序中設(shè)要捕獲一個異常,程序員只需要在程序中設(shè) 置一個置一個try/catchtry/catch塊,其格式如下:塊,其格式如下: trytr

22、y 拋出異常的代碼拋出異常的代碼 catch (catch (某某ExceptionException類型類型 e)e) 處理該異常類型的代碼處理該異常類型的代碼 catch (catch (某某ExceptionException類型類型 e)e) 處理該異常類型的代碼處理該異常類型的代碼 第五章Java的異常處理 v try 捕獲異常的第一步是用try選定捕獲異常 的范圍,由try所限定的代碼塊中的語句在 執(zhí)行過程中可能會生成異常對象并拋出。 第五章Java的異常處理 v catch 每個try代碼塊可以伴隨一個或多個catch語句,用于 處理try代碼塊中所生成的異常事件。catch語句

23、只需要 一個形式參數(shù)指明它所能夠捕獲的異常類型,這個類必 須是Throwable的子類,運行時系統(tǒng)通過參數(shù)值把被拋出 的異常對象傳遞給catch塊. 在catch塊中是對異常對象進行處理的代碼,與訪問其 它對象一樣,可以訪問一個異常對象的變量或調(diào)用它的 方法。getMessage( )是類Throwable所提供的方法,用 來得到有關(guān)異常事件的信息,類Throwable還提供了方 法printStackTrace( )用來跟蹤異常事件發(fā)生時執(zhí)行堆棧 的內(nèi)容。 第五章Java的異常處理 異常的捕獲過程 v當(dāng)當(dāng)trytry塊中的某條代碼拋出異常時:首先,自塊中的某條代碼拋出異常時:首先,自 該語句

24、的下一條語句起的所有該語句的下一條語句起的所有trytry塊中的剩余塊中的剩余 語句將被跳過不予執(zhí)行;其次,程序執(zhí)行語句將被跳過不予執(zhí)行;其次,程序執(zhí)行 catchcatch子句進行異常捕獲,異常捕獲的目的是子句進行異常捕獲,異常捕獲的目的是 進行異常類型的匹配,并執(zhí)行與所拋出的異進行異常類型的匹配,并執(zhí)行與所拋出的異 常類型相對應(yīng)的常類型相對應(yīng)的catchcatch子句中的異常處理代碼。子句中的異常處理代碼。 第五章Java的異常處理 異常的捕獲過程 v需要注意的是:如果需要注意的是:如果trytry塊中沒有任何的異常塊中沒有任何的異常 拋出,則所有的拋出,則所有的catchcatch子句將

25、會被跳過;如果子句將會被跳過;如果 trytry塊中所拋出的異常對象類型與所有的塊中所拋出的異常對象類型與所有的 catchcatch子句中的所聲明的異常類型都不匹配,子句中的所聲明的異常類型都不匹配, 則方法會立即中止,并將該異常對象繼續(xù)拋則方法會立即中止,并將該異常對象繼續(xù)拋 出,沿調(diào)用堆棧傳遞。出,沿調(diào)用堆棧傳遞。 第五章Java的異常處理 example public class ExampleOfException String lines = The first line, The second line,The last line; public static void main

26、 (String args) ExampleOfException eoe = new ExampleOfException(); eoe.methodA(); System.out.println(Program finished.); . void methodC() for (int i=0; i10 ) throw new MyException(a); System.out.println(normal exit); public static void main( String args ) try compute( 1 ); compute( 20 ); catch( MyExc

27、eption e ) System.out.println(Caught +e); 程序運行結(jié)果:程序運行結(jié)果: called compute(1)called compute(1) normal exitnormal exit called compute(20)called compute(20) Caught MyException 20Caught MyException 20 第五章Java的異常處理 異常類的使用 v運行時異常則表示由運行時系統(tǒng)所檢測到的 程序設(shè)計問題或者API的使用不當(dāng)問題,它可 能在程序的任何地方出現(xiàn): (1)對于運行時異常,如果不能預(yù)測它何時發(fā) 生,程序可以不

28、做處理,而是讓Java虛擬 機去處理它。 (2)如果程序可以預(yù)知運行時異??赡馨l(fā)生的 地點和時間,則應(yīng)該在程序中進行處理,而 不應(yīng)簡單的把它交給運行時系統(tǒng)。 第五章Java的異常處理 異常類的使用 (3)在自定義異常類時,如果它所對應(yīng)的異 常事件通??偸窃谶\行時產(chǎn)生的,而且 不容易預(yù)測它將在何時、何處發(fā)生,則 可以把它定義為運行時異常,否則應(yīng)定 義為非運行時異常。 第五章Java的異常處理 異常類的使用 v積極處理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) try fis =

29、 new ( text ); catch( e) 第五章Java的異常處理 異常類的使用 v消極處理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) throws fis = new ( text ); 第五章Java的異常處理 異常類的使用 v如果采用消極處理方式,則由調(diào)用該方法的方 法進行處理;但是調(diào)用該方法的方法也可以采 用消極和積極兩種處理方式,一直傳遞到Java 運行環(huán)境. 第五章Java的異常處理 異常的優(yōu)點 v將錯誤處理代碼與將錯誤處理代碼與“常規(guī)常規(guī)”代碼分離;代碼

30、分離; 將錯誤沿調(diào)用堆棧傳遞;將錯誤沿調(diào)用堆棧傳遞; 可以由感興趣的方法來處理異??梢杂筛信d趣的方法來處理異常 v對錯誤類型進行分組和區(qū)分。對錯誤類型進行分組和區(qū)分。 第五章Java的異常處理 說明的問題 v方法也可以不對異常進行捕獲而直接將其拋出,并方法也可以不對異常進行捕獲而直接將其拋出,并 在方法聲明中進行說明,那么對方法產(chǎn)生的異常到在方法聲明中進行說明,那么對方法產(chǎn)生的異常到 底是應(yīng)該直接進行捕獲還是應(yīng)該將其進行傳遞呢?底是應(yīng)該直接進行捕獲還是應(yīng)該將其進行傳遞呢? v一般來說,對于方法的最終調(diào)用者而言,他必須捕一般來說,對于方法的最終調(diào)用者而言,他必須捕 獲并處理該方法拋出的異常。而對于拋出異常的方獲并處理該方法拋出的異常。而對于拋出異常的方 法而言,應(yīng)該對方法可能產(chǎn)生的異常進行區(qū)分,盡法而言,應(yīng)該對方法可能產(chǎn)生的異常進行區(qū)分,盡 量避免一些異常的產(chǎn)生,捕獲并處理那些你知道如量避免一些異常的產(chǎn)生,捕獲并處理那些你知道如 何處理的異常,而對那些你不知道方法的調(diào)用者會何處理的異常,而對那些你不知道方法的調(diào)用者會 如何處理的異常,最好將它們留給方法的調(diào)用者進如何處理的異常,最好將它們留給方法的調(diào)用者進

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論