Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)課件第9章-異常處理_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)課件第9章-異常處理_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)課件第9章-異常處理_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)課件第9章-異常處理_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版)課件第9章-異常處理_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章異常處理本章內(nèi)容異常及異常處理概念異常處理機(jī)制原理捕獲與處理異常方法自定義異常教學(xué)目標(biāo)理解出現(xiàn)異常的原因理解異常處理的方法掌握try-catch的異常處理機(jī)制的應(yīng)用掌握throw及throws子句的應(yīng)用能夠自定義異常9.1引例異常是用來處理程序錯(cuò)誤的有效機(jī)制。通過系統(tǒng)拋出的異常,程序可以很容易地捕獲并處理發(fā)生的異常情況。對(duì)于一個(gè)應(yīng)用軟件,異常處理是不可缺少的。為了說明什么是異常,我們先來看下面的例子。例9.1異常處理引例分析:在進(jìn)行除法運(yùn)算的時(shí)候,有時(shí)會(huì)出現(xiàn)除數(shù)為0的錯(cuò)誤。以下實(shí)例就是演示這種錯(cuò)誤。運(yùn)行結(jié)果:

這是一個(gè)異常處理的引例!

Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatJpro9_1.main(Jpro9_1.java:5)程序分析:

在程序正常情況下,輸出結(jié)果應(yīng)該是“這是一個(gè)異常處理的引例!”“i=”但在執(zhí)行除法運(yùn)算時(shí)發(fā)現(xiàn)除數(shù)為0,拋出了java.lang.ArithmeticException異常,程序終止,并顯示錯(cuò)誤信息。錯(cuò)誤的原因在于除數(shù)為0。Java發(fā)現(xiàn)這個(gè)錯(cuò)誤后,便由系統(tǒng)拋出ArithmeticException類的異常,用來表明錯(cuò)誤的原因,并停止運(yùn)行程序。例9.1異常處理引例(續(xù))異常從上述例題可以分析出,在Java語言中,并不是所有程序都是完美的,會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤,我們將程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤叫做異常。下面任何一種情況都會(huì)出現(xiàn)異常:想打開的文件不存在;在訪問數(shù)組時(shí),數(shù)組的下標(biāo)值超過了數(shù)組允許的范圍;整除時(shí)除數(shù)為0;正在裝載的類文件丟失。上述情況在編譯時(shí)都是正確的,但程序運(yùn)行時(shí)會(huì)提示拋出異常的信息。這時(shí)需要手工檢查錯(cuò)誤情況,這種方法既繁瑣又易出錯(cuò)。實(shí)際上,只要編寫一些額外的程序代碼繞過這些情況,讓程序繼續(xù)執(zhí)行即可。異常處理機(jī)制在Java中,所有的異常都是以類的形式存在,除了內(nèi)置的異常類之外,Java允許自定義異常類。Java中的每個(gè)異常類都代表了一種運(yùn)行錯(cuò)誤,每當(dāng)Java程序運(yùn)行過程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,即產(chǎn)生一個(gè)異常。一旦一個(gè)異常對(duì)象產(chǎn)生了,系統(tǒng)中就一定要有相應(yīng)的機(jī)制來處理它,確保不會(huì)產(chǎn)生死機(jī)、死循環(huán)或其他對(duì)操作系統(tǒng)的損害,從而保證整個(gè)程序運(yùn)行的安全性,這就是Java的異常處理機(jī)制。在沒有異常處理機(jī)制的語言中,必須使用if-else或switch等語句,捕獲程序中所有可能發(fā)生的錯(cuò)誤情況。Java的異常處理機(jī)制恰好彌補(bǔ)這個(gè)不足,它具有易于使用、可自定義異常類、允許拋出異常且不會(huì)降低運(yùn)行速度等優(yōu)點(diǎn)。因而在設(shè)計(jì)Java程序時(shí),充分利用Java異常處理機(jī)制,可大大提高程序的穩(wěn)定性、安全性及效率。9.2異常和異常類異常與其他語言要素一樣,是面向?qū)ο蠓秶囊徊糠?,是異常類的?duì)象。Java所有的異常對(duì)象都是繼承Throwable的類的實(shí)例,Throwable類是類庫(kù)java.lang包中的一個(gè)類,它派生出兩個(gè)子類:Error類和Exception類,如圖9-1所示。圖9-1只列出了部分異常類,關(guān)于其他的異常類在教材相應(yīng)的部分中將會(huì)介紹。IOException…………ThrowableErrorExceptionRuntimeExceptionArithmeticException圖9-1Java異常層次結(jié)構(gòu)簡(jiǎn)化示意圖9.2異常和異常類(續(xù))Error類的錯(cuò)誤被認(rèn)為是不能恢復(fù)的嚴(yán)重錯(cuò)誤,如系統(tǒng)內(nèi)部錯(cuò)誤、資源耗盡錯(cuò)誤等。在此情況下,除了通知用戶并試圖終止程序外幾乎是不能做其他任何處理的,因此,不應(yīng)該拋出這種類型的錯(cuò)誤,而是直接讓程序中斷。這種情況一般很少出現(xiàn)。Exception類定義可能遇到的輕微錯(cuò)誤,分為:RuntimeException類的異常和IOException類的異常。由程序錯(cuò)誤導(dǎo)致的異常屬于RuntimeException,而程序本身沒有問題;但由于像I/O錯(cuò)誤這類問題導(dǎo)致的異常屬于其他異常。Exception類異常可以寫代碼來處理并繼續(xù)程序執(zhí)行,而不是讓程序中斷。9.2異常和異常類(續(xù))RuntimeException應(yīng)該由編程人員來負(fù)責(zé),例如檢查除數(shù)是否為零,訪問數(shù)組元素時(shí)判斷數(shù)組下標(biāo)是否越界等。而非RuntimeException的異常則不完全取決于代碼,有時(shí)候與環(huán)境密切相關(guān),如不同的瀏覽器能夠處理不同的URL,IE能夠處理mailto:URL,而applet查看器(appletviewer)將會(huì)出現(xiàn)I/O的異常等。9.2異常和異常類(續(xù))9.3異常處理當(dāng)一個(gè)異常被拋出(即產(chǎn)生了異常)時(shí),該如何處理呢?本節(jié)將詳細(xì)介紹Java捕獲和處理異常的語句。在Java語言中使用語句try-catch-finally進(jìn)行異常處理,程序流程從引入異常的代碼轉(zhuǎn)移到最近的try語句的catch子句,如例9.2所示。9.3.1一個(gè)異常處理示例例9.2一個(gè)除數(shù)為0的異常處理例子。分析:本例在程序中通過異常處理機(jī)制來捕獲和處理ArithmeticException異常。程序代碼如下:運(yùn)行結(jié)果: 這是一個(gè)異常處理的引例! 除數(shù)不能為0。程序分析: 程序中對(duì)除數(shù)為0帶來的異常進(jìn)行了處理,將可能出現(xiàn)異常的代碼放在try語句塊中,catch語句塊處理try塊中語句可能產(chǎn)生的異常。Java異常處理機(jī)制允許程序捕獲異常并處理,然后繼續(xù)程序執(zhí)行。因此,錯(cuò)誤情況不會(huì)介入到程序的正常流程中。關(guān)于try-catch語句的使用以及如何捕獲及處理異常將在9.3.3節(jié)詳細(xì)介紹。9.3.1一個(gè)異常處理示例(續(xù))9.3.2捕獲異常通過例9.2可知異常的捕獲和處理是由try、catch所組成的程序塊完成的。try-catch語句塊的格式如下:try{

可能產(chǎn)生異常的代碼//try塊}catch(ExceptionTypee1){//要捕獲的異常類型對(duì)此異常的處理//異常處理,可以為空}

……catch(ExceptionTypeen){//要捕獲的異常類型對(duì)此異常的處理//異常處理,可以為空}異常的捕獲和處理流程異常的捕獲和處理流程如下:1.如果try塊中沒有代碼產(chǎn)生異常,那么程序?qū)⑻^catch子句。2.try塊中的任意代碼產(chǎn)生一個(gè)屬于catch子句所聲明類的異常,程序?qū)⑻^try塊中的剩余代碼,并執(zhí)行與所產(chǎn)生異常類型匹配的catch子句的異常處理代碼。3.如果try塊中的代碼產(chǎn)生一個(gè)不屬于所有catch子句所聲明類的異常,那么該方法會(huì)立即退出。4.在一個(gè)try塊中可能產(chǎn)生多種類型的異常,這時(shí)需要用多個(gè)catch塊來進(jìn)行捕獲和處理。每個(gè)異常產(chǎn)生時(shí),Java將逐個(gè)檢查這些catch子句,發(fā)現(xiàn)與拋出的異常類型匹配時(shí)就執(zhí)行那一段異常處理代碼,而其余的不會(huì)被執(zhí)行。finally語句塊當(dāng)異常產(chǎn)生時(shí),方法的執(zhí)行流程以非線性方式執(zhí)行,甚至在沒有匹配的catch子句時(shí),可能從方法中過早退出。但有時(shí),無論異常未產(chǎn)生還是產(chǎn)生后被捕獲,都希望有些語句必須執(zhí)行。例如在進(jìn)行文件操作時(shí),首先要打開文件,接著對(duì)文件進(jìn)行處理,然后關(guān)閉文件,出于安全因素的考慮,希望無論異常發(fā)生與否都要執(zhí)行關(guān)閉文件操作,由上述異常處理流程可知關(guān)閉文件的操作放在try或catch語句塊中都不合適,finally語句就提供了上述問題的解決辦法,即在try-catch語句塊之后創(chuàng)建一個(gè)finally語句塊。先請(qǐng)看下面的程序片斷:只要程序中包含finally子句,不管異常產(chǎn)生與否,都將執(zhí)行finally塊,這就避免了執(zhí)行程序從方法中過早退出的現(xiàn)象。上述代碼中,無論程序是否產(chǎn)生或產(chǎn)生后捕獲到異常,關(guān)閉文件的代碼都在運(yùn)行過程中執(zhí)行一次。finally語句塊(續(xù))例9.3一個(gè)應(yīng)用try-catch-finally語句的示例。運(yùn)行結(jié)果:這是一個(gè)異常處理的綜合實(shí)例!除數(shù)不能為0!出現(xiàn)異常。這里的語句總會(huì)被執(zhí)行哦。程序分析: 程序中使用了try-catch-finally語句,并有兩條catch語句,但只執(zhí)行了一條。請(qǐng)讀者考慮:程序的執(zhí)行順序,以及程序中為何沒有輸出s的值?例9.3一個(gè)應(yīng)用try-catch-finally語句的示例。(續(xù))9.3.3拋出異常 Java程序在運(yùn)行時(shí)如果引發(fā)了一個(gè)可以識(shí)別的錯(cuò)誤,就會(huì)產(chǎn)生一個(gè)與該錯(cuò)誤相對(duì)應(yīng)的異常類的對(duì)象,這個(gè)過程稱作異常的拋出,實(shí)際是相應(yīng)異常類的實(shí)例的拋出。根據(jù)異常類的不同,拋出異常的方式也有所不同。如果是系統(tǒng)自動(dòng)拋出的異常,系統(tǒng)將會(huì)為這些錯(cuò)誤產(chǎn)生對(duì)應(yīng)異常類的實(shí)例。其他還有throw語句和throws子句拋出的異常。1.系統(tǒng)自動(dòng)拋出的異常 所有的系統(tǒng)定義的異常由系統(tǒng)自動(dòng)地拋出,即一旦出現(xiàn)這些運(yùn)行錯(cuò)誤,系統(tǒng)將會(huì)為這些錯(cuò)誤產(chǎn)生對(duì)應(yīng)異常類的實(shí)例。2.語句拋出的異常 用戶自定義的異常不可能依靠系統(tǒng)自動(dòng)拋出,必須用throw語句拋出一。首先,必須知道什么情況下產(chǎn)生了某種異常對(duì)應(yīng)的錯(cuò)誤,然后為這個(gè)異常類創(chuàng)建一個(gè)實(shí)例,最后用throw語句拋出。throw關(guān)鍵字通常用于方法體中,拋出一個(gè)異常類的實(shí)例。 通過throw拋出異常后,如果希望在上一級(jí)代碼中來捕獲并處理異常,則需要在拋出異常的方法中使用throws關(guān)鍵字,即在方法的聲明中指明要拋出的異常,格式如下:9.3.3拋出異常(續(xù))返回類型方法名(參數(shù)列表)throws要拋出的異常類名列表{

……throw異常實(shí)例;

……}

這樣定義方法后,可通知所有要調(diào)用這個(gè)方法的上層方法,準(zhǔn)備接受和處理它在運(yùn)行中拋出的異常。若方法中的throw語句不只一個(gè),則要拋出的異常類名列表應(yīng)包含方法中所有的throw語句所拋出的異常。如:某個(gè)方法myMethod可能產(chǎn)生Exception1、Exception2和Exception3三種異常,而它們又都是Super_Exception類的子類,如圖9-2所示,則應(yīng)在相應(yīng)的方法中聲明可能拋出的異常類,語句如下:9.3.3拋出異常(續(xù))voidmyMethod()throwsException1,Exception2,Exception3{

……//可能拋出這三個(gè)異常}Super_ExceptionException1Exception3Exception29.3.3拋出異常(續(xù))Super_ExceptionException1Exception3Exception2圖9-2異常類繼承關(guān)系

除了以上這種聲明拋出Exception1、Exception2和Exception3三種異常之外,還可以只簡(jiǎn)單地聲明拋出Super_Exception,下面這種方式和上面的是等價(jià)的:voidmyMethod()throwsSuper_Exception{……//可能拋出這三個(gè)異常的父類}9.3.3拋出異常(續(xù))9.3.3拋出異常(續(xù))

在Java語言中如果調(diào)用了一個(gè)可能產(chǎn)生異常的方法,且調(diào)用方法也拋出這個(gè)異常,則在調(diào)用方法中要對(duì)這個(gè)異常進(jìn)行聲明,如下面代碼,voidyourMethod()throwsSuper_Exception{……myMethod();//調(diào)用了可能會(huì)拋出異常的方法……} Java語言要求所有用throws關(guān)鍵字聲明的類和用throw拋出的對(duì)象必須是Throwable類或其子類。Java提供了大量的錯(cuò)誤和異常類,可以用來區(qū)分Java程序執(zhí)行過程中出現(xiàn)的各類錯(cuò)誤和異常。但如果試圖拋出一個(gè)不可拋出的異常,Java編譯器將會(huì)報(bào)錯(cuò)。9.3.3拋出異常(續(xù))

通過throw拋出異常后,如果要捕獲異常,則必須使用try-catch語句,格式如下:返回類型方法名(參數(shù)列表){try{

……throw異常實(shí)例;

……}catch(ExceptionTypee){

……}}

9.3.3拋出異常(續(xù))

在Java語言中如果調(diào)用了一個(gè)可能產(chǎn)生異常的方法,調(diào)用方法也可以捕獲這個(gè)異常,如下面代碼,voidyourMethod(){try{……myMethod();//調(diào)用了可能會(huì)拋出異常的方法

……}catch(Super_Exception){

……}}3.重新拋出異常 在某些情況下,需要重新拋出剛才產(chǎn)生過的異常,特別是在用Exception捕獲所有可能的異常時(shí),由于已擁有當(dāng)前異常的對(duì)象名,所以只需簡(jiǎn)單地重新拋出那個(gè)對(duì)象名即可。例如:9.3.3拋出異常(續(xù))例9.4一個(gè)重新拋出異常的示例。運(yùn)行結(jié)果:這是一個(gè)重新拋出異常的例子!exceptioninf()在main()種捕獲Exceptioninthread"main"java.lang.Exception:從f()拋出

atJpro9_4.f(Jpro9_4.java:4) atJpro9_4.main(Jpro9_4.java:9)

程序分析:

程序中定義了靜態(tài)方法f(),該方法拋出Exception異常,main()方法中調(diào)用方法f()并通過try-catch進(jìn)行捕獲和處理,處理過程(catch塊)中再次將異常重新拋出,因此在方法聲明中通過throws子句進(jìn)行聲明。例9.4一個(gè)重新拋出異常的示例。(續(xù))9.4自定義異常類 Java語言可以通過繼承的方式編寫自己的異常類。因?yàn)樗械漠惓n惥^承自Exception類,所以自定義類也必須繼承這個(gè)類。自定義異常類的語法如下,class異常類名extendsException{……}

在自定義異常類里通過編寫新的方法來處理相關(guān)的異常,甚至可以不編寫任何語句也可正常工作,因?yàn)镋xception類已提供相當(dāng)豐富的方法。例9.5說明如何自定義異常類及使用方法。例9.5創(chuàng)建自己的異常類運(yùn)行結(jié)果:這是一個(gè)自定義異常的例子!Lucy2010-05-10您的字符串長(zhǎng)度為14,超出所允許的最大長(zhǎng)度10,出現(xiàn)異常。程序分析: 程序第一行通過繼承異常類Exception創(chuàng)建了異常類MyException,并定義了它的一個(gè)構(gòu)造方法和一個(gè)成員方法。異常類和普通類一樣,可以有成員變量、方法,能對(duì)變量進(jìn)行操作。程序中還定義了一個(gè)類Jpro9_5,該類main()方法中根據(jù)字符串長(zhǎng)度str的長(zhǎng)度判斷是否拋出異常,若其長(zhǎng)度大于10,則通過“thrownewMyException(str);”語句拋出自定義的異常,并通過try-catch進(jìn)行處理,輸出異常信息。例9.5創(chuàng)建自己的異常類(續(xù))9.5實(shí)例例9.6多個(gè)異常catch語句使用。分析: 程序中根據(jù)變量i值的不同,拋出三個(gè)異常,分別用三個(gè)catch語句塊來捕獲和處理異常,請(qǐng)看下面的源代

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論