JAVA語言與編程第6章異常處理課件_第1頁
JAVA語言與編程第6章異常處理課件_第2頁
JAVA語言與編程第6章異常處理課件_第3頁
JAVA語言與編程第6章異常處理課件_第4頁
JAVA語言與編程第6章異常處理課件_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 異常處理第1頁,共20頁。6.1 異常和異常類 異常(exception)又稱例外,是特殊的運行錯誤對象. Java中定義了很多異常類,每個異常類代表了一種運行錯誤,類中包含了該運行錯誤的信息和處理錯誤的方法等內(nèi)容.每當Java程序運行過程中發(fā)生一個可識別的運行錯誤時,即該錯誤有一個異常類與之相對應時,系統(tǒng)都會產(chǎn)生一個相應的異常類的對象,即產(chǎn)生一個異常.一旦一個異常對象產(chǎn)生了,系統(tǒng)中就有相應的機制來處理它,確保不會產(chǎn)生死機,死循環(huán)或其他對os的損害,從而保證了整個程序運行的安全性.第2頁,共20頁。6.1 異常和異常類(續(xù))6.1.1 異常類結構與組成 Java的所有異常類都是系統(tǒng)類T

2、hrowable的子類,Java中主要異常類層次結構如下圖: Throwable類是java.lang包中的一個類,它直接派生了兩個子類:Error類和Exception類.Error是與系統(tǒng)或JVM相關的異常,標志著嚴重的系統(tǒng)錯誤,是不可恢復的;Exception用于用戶程序可能捕獲的異常,該類及其子類是一些與用戶程序相關的異常,它們也可以用作創(chuàng)建自定義異常類的超類.Exception的一個重要子類RuntimeException,運行時異常,該類型的異常自動為程序定義,包括被零除異常和數(shù)組下標越界異常等.第3頁,共20頁。6.1 異常和異常類(續(xù))1.Exception類的構造函數(shù) pub

3、lic Exception(); public Exception(String s); 其中第二個構造函數(shù)可以接收字符串參數(shù)傳入的信息,該信息通常是對異常的描述.2.Exception類及其子類從Throwable類繼承的幾個重要的方法:public String getMessage() 該方法返回一個詳細描述異常的字符串public void printStackTrace() 該方法沒有返回值,它的功能是輸出當前異常對象的堆棧使用軌跡,即程序先后調(diào)用執(zhí)行了哪些對象或類的哪些方法,導致運行過程中產(chǎn)生了這個異常對象.public String toString() 該方法返回一個簡潔描述該

4、異常的字符串6.1.2 非檢查型異常與檢查型異常 根據(jù)編譯器是否對異常做檢查,Java的異常分為兩類:非檢查型異常和檢查型異常.在異常的層次結構中,Error及其子類和RuntimeException及其子類都是非檢查型異常,它是一種編譯器不檢查一個方法是否處理或指定向上拋出的異常,它們都是Java運行時系統(tǒng)內(nèi)發(fā)生的異常.第4頁,共20頁。6.1 異常和異常類(續(xù)) 常見的非檢查型異常:異 常異常對應的運行錯誤ArithmeticException算術錯誤,例如被0除ArrayIndexOutOfBoundsException數(shù)組下標越界ClassCastException無效的類型轉(zhuǎn)換Ind

5、exOutOfBoundsException某些類型的下標越界EmptyStackException空棧異常NegativeArraySizeException用負數(shù)創(chuàng)建數(shù)組NullPointerException使用空引用錯誤NumberFormatException字符串到數(shù)字格式的無效轉(zhuǎn)換StringIndexOutOfBounds嘗試在一個字符串邊界之外進行索引第5頁,共20頁。6.1 異常和異常類(續(xù)) Exception及其除了RuntimeException以外的所有子類都是檢查型異常,它是一種編譯器必須檢查一個方法是否處理或指定向上拋出的異常,是在Java運行時系統(tǒng)外的代碼中發(fā)

6、生的異常,如果一個方法沒有處理或指定向上拋出可能發(fā)生的檢查型異常,那么該方法就不能通過編譯器的編譯.常見的檢查型異常如下: 這里只討論與用戶應用程序相關的異常,即Exception分支,它包括所有的檢查型異常和運行時異常.異 常異常對應的運行錯誤ClassNotFoundException未找到欲裝載的類CloneNotSupportedException嘗試復制一個沒有實現(xiàn)Cloneable接口的對象FileNotFoundException未找到指定的文件或目錄IllegalAccessException對一個類的訪問被拒絕IOException輸入、輸出錯誤InterruptedExce

7、ption線程在睡眠、等待或因其他原因暫停時被其他線程打斷第6頁,共20頁。6.2 異常的捕獲和處理 Java的異常處理機制可以概括為以下幾個過程:(1)在Java程序的執(zhí)行過程中,如果出現(xiàn)了一個可識別的錯誤,則會生成一個與該錯誤相對應的異常類的對象,該異常將被提交給Java運行時系統(tǒng),這個過程稱為拋出異常(2)當Java運行時系統(tǒng)接收到異常對象后,會尋找能處理這一異常的代碼并把當前異常對象交給其處理,這一過程成為捕獲異常(3)如果Java運行時系統(tǒng)找不到處理異常的程序,那么它將終止程序的執(zhí)行,最后調(diào)用默認異常處理程序來處理異常第7頁,共20頁。6.2 異常的捕獲和處理(續(xù)) Java語言提供

8、try-catch-finally語句來捕獲并處理一個或多個異常,其一般格式為:try catch()catch()catch()finally 第8頁,共20頁。6.2 異常的捕獲和處理(續(xù)) 關于異常處理結構的幾點說明:(1)try語句中是一段可能產(chǎn)生異常的代碼段,可能拋出一個或多個異常,try指定了catch捕獲異常的代碼范圍(2)catch語句: 1try后通常跟一個或多個catch語句來處理try中異常,若try中沒有產(chǎn) 生異常,則catch塊不會執(zhí)行 2catch語句需要一個形式參數(shù):異常類名及其對象,運行時由系統(tǒng)通過 參數(shù)值把拋出的異常對象傳遞給catch語句塊,在語句塊中對異常

9、做 相應的處理 3處理異常時,通過異常類提供的toString()或getMessage()方法可以 獲得有關異常的信息,最常用的是printStackTrace() 4出現(xiàn)異常時,系統(tǒng)根據(jù)catch語句的出現(xiàn)順序?qū)Ξ惓n愋瓦M行檢測,因 此catch語句塊的排列順序應該從特殊到一般(3)finally語句:為程序提供一個統(tǒng)一的出口,通常在該語句塊中可以進行資源的清除,如關閉文件等.第9頁,共20頁。6.2 異常的捕獲和處理(續(xù))public class ExceptionFlow public static void main (String args) System.out.println

10、(顯示Java異常處理的執(zhí)行流程) ; System.out.println (即將進入try塊) ; try System.out.println (進入了try塊!) ; int b=0; int a=3; if (b=0) System.out.println (異常發(fā)生!) ; a=a/b; System.out.println (沒有異常發(fā)生!) ; catch (ArithmeticException e) System.out.println (進入catch塊,處理異常!) ; System.out.println (catch塊之后!) ; 第10頁,共20頁。6.2 異常的

11、捕獲和處理(續(xù))例:不含catch子句的異常處理public class ExceptionNonCatch public static void main (String strs) System.out.println (RuntimeException non-catch clause test.); int a=5; int b=0; for (int i=1;i=0;i-) try System.out.println (-i=+i+-) ; b=a/i; System.out.println (After no exception occur!) ; finally System.

12、out.println (Finally block!) ; System.out.println (After finally block!) ; 第11頁,共20頁。6.2 異常的捕獲和處理(續(xù))例:捕獲被零除異常public class ExceptionWithCatch public static void main (String strs) System.out.println (RuntimeException with catch clause test.) ; int a=5; int b=0; for (int i=1;i=0;i-) try System.out.pri

13、ntln (-i=+i+-) ; b=a/i; System.out.println (After no exception occur!) ; catch (ArithmeticException e) System.out.println (Catch block,i.e.exception handling code.) ; finally System.out.println (Finally block!) ; System.out.println (After finally block!) ; 第12頁,共20頁。6.2 異常的捕獲和處理(續(xù)) 從以上兩個例子,可以總結出以下幾點

14、:不論異常是否發(fā)生,finally塊總是被執(zhí)行.當一個異常在本層沒有相應的catch處理塊時,執(zhí)行完finally塊后,再將這個異常拋出給上層try語句塊中異常發(fā)生點以后的代碼不能被執(zhí)行當沒有catch塊處理相應的異常時,默認異常處理程序打印出有關的異常信息并終止程序第13頁,共20頁。6.3 指定方法拋出異常 在有些情況下,方法暫時還不能確定如何處理異常,它可以將異常進一步向上層拋出,將處理異常的任務留給調(diào)用它的方法.如果是檢查型異常,拋出異常的方法必須在方法頭使用throws子句指定向上拋出的異常,如果是非檢查型異常,可以不這么做,但是為了給調(diào)用者一個明確的接口,建議也這么做.指定方法拋出

15、異常的格式為: () throws 例:下面的方法頭使用了throws子句public void readFile (String file) throws FileNotFoundException FileInputStream f=new FileInputStream (file); /可能產(chǎn)生FileNotFoundException異常/例:ThrowsException.java第14頁,共20頁。6.3 指定方法拋出異常(續(xù))注:(1)若程序執(zhí)行時一個檢查型異常被拋出,那么要么在當前方法中捕獲并拋出,否則必須在方法聲明中用throws子句列出所拋出的異常,否則編譯無法通過(2)

16、如果是運行時異??梢圆徊东@它,也可以不在方法頭部聲明異常.但如果運行時異常要進一步向上拋出的話,建議最好也在throws子句中列出,這樣便于方法調(diào)用者處理異常;否則,如果調(diào)用方法中沒有給出異常處理程序,則系統(tǒng)沿著調(diào)用堆棧繼續(xù)向上查找,當找不到匹配的處理程序時,在默認情況下系統(tǒng)將終止程序的執(zhí)行.第15頁,共20頁。6.4 拋出異常 拋出異常有兩種方法,一種是系統(tǒng)自動拋出異常,另外一種是用throws語句指定在程序中拋出異常.6.4.1 系統(tǒng)自動拋出的異常 所有的系統(tǒng)異常都可以由系統(tǒng)自動拋出,但用戶自定義的異常不能由系統(tǒng)自動拋出.例:系統(tǒng)自動拋出異常ArrayIndexOutOfBoundsExc

17、eptionpublic class TestThrowSystemException public static void main (String args ) int a =1,2,3; int i=3; System.out.println (ai) ; /數(shù)組下標越界,引發(fā)系統(tǒng)拋出異常 Exception in thread main java.lang. ArrayIndexOutOfBoundsException: 3 at TestThrowSystemException.main (TestThrowSystemException.java:5)第16頁,共20頁。6.4 拋

18、出異常(續(xù))6.4.2 throws語句拋出的異常 在Java中可以使用throw語句指定在程序中拋出某種類型的異常: throw ;注:如果程序企圖拋出一個不是throwable或其子類的對象,程序?qū)o法通過編譯.而在一般情況下,程序中拋出的應該是Exception或其子類的對象.例:public class TestThrow public static void main (String args )throws ArrayIndexOutOfBoundsException int a =1,2,3; int i=3; if (i2|i0) throw new ArrayIndexOut

19、OfBoundsException (); else System.out.println (ai); 第17頁,共20頁。6.4 拋出異常(續(xù)) 使用throw語句拋出異常應注意的幾個問題:(1)一般這種拋出異常的語句應該被定義為在滿足一定條件時執(zhí)行,例如把throw語句放在if分支中.(2)catch后的參數(shù)類型(T1)必須和throw后的表達式類型(T2)一致,即或者T1和T2一樣,或者T1是T2的父類(3)含有throw語句的方法,應該在方法頭中拋出異常,這樣做主要是為了通知所有想要調(diào)用此方法的方法準備接收和處理在運行過程中可能會拋出的異常例:ThrowExceptionDemo1.java6.4.3 自定義異常類 系統(tǒng)定義的異常用來處理系統(tǒng)可以識別的較常見的運行錯誤,對于某個應用程序特有的運行錯誤,則需要編程人員根據(jù)程序的特殊邏輯在用戶程序中自己創(chuàng)建用戶自定義的異常類和異常對象。 Java允許用戶自定義異常類,但必須繼承現(xiàn)有的異常類。因此第一個自定義異常類必須從系統(tǒng)異常類如Exception,RuntimeException或它們的子類派生,其后定義的異常類可以從系統(tǒng)或自定義的異常類派生。第18頁,共20頁。6.4 拋出異常(續(xù)) cl

溫馨提示

  • 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

提交評論