第6章 異常處理機制課件_第1頁
第6章 異常處理機制課件_第2頁
第6章 異常處理機制課件_第3頁
第6章 異常處理機制課件_第4頁
第6章 異常處理機制課件_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

核心Java編程

(J2SE5.0或以上版本)授課教師:謝云翔第6章異常處理機制

第六章異常處理機制

1、例外的概念

2、例外的分類(Throwable/Exception)3、捕獲例外(try-catch-finally)4、聲明例外(throws)5、拋出例外(throw)6、創(chuàng)建自己的例外第6章異常處理機制

一、例外的概念

在進行程序設(shè)計時,錯誤的產(chǎn)生是不可避免的,如何處理錯誤?把錯誤交給誰去處理?程序又該如何從錯誤中恢復(fù)?這是任何程序設(shè)計語言都要解決的問題。所謂錯誤,是在程序運行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運行。為了加強程序的魯棒性(強壯性,robust),程序設(shè)計時,必須考慮到可能發(fā)生的異常事件并做出相應(yīng)的處理。第6章異常處理機制

一、例外的概念

在C語言中,通過使用if語句來判斷是否出現(xiàn)了錯誤,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的錯誤事件并進行處理。但是,這種錯誤處理機制會導(dǎo)致不少問題,因為在很多情況下需要知道錯誤產(chǎn)生的內(nèi)部細(xì)節(jié)。通常,用全局變量Errno來存儲一個異常事件的類型,這容易導(dǎo)致誤用,因為一個Errno的值有可能在被處理前被另外的錯誤覆蓋掉。此外,即使最優(yōu)美的C語言程序,為了處理異常情況,也常常求助于goto語句。第6章異常處理機制

一、例外的概念以常規(guī)方法處理錯誤存在的問題:觀察C語言的程序,大家會發(fā)現(xiàn)大部分精力花在出錯處理上了只把能夠想到的錯誤考慮到,對以外的情況無法處理程序可讀性差,大量的錯誤處理代碼混雜在程序中出錯返回信息量太少,無法更確切的了解錯誤狀況或原因第6章異常處理機制

一、例外的概念

Java通過面向?qū)ο蟮姆椒▉硖幚沓绦蝈e誤,在Java中,錯誤被稱為例外(Exception)或稱為異常。在一個方法的運行過程中,如果發(fā)生了例外,則這個方法(或者是Java虛擬機)生成一個代表該例外的對象(包含了該例外的詳細(xì)信息),并把它交給運行時系統(tǒng),運行時系統(tǒng)尋找相應(yīng)的代碼來處理這一例外。我們把生成例外對象并把它提交給運行時系統(tǒng)的過程稱為拋棄(throw)一個例外。運行時系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應(yīng)例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。第6章異常處理機制

一、例外的概念用例外的形式處理錯誤:{try{openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}

catch() {dosomething;}

catch(sizeDetermineFailed) {dosomething;}

catch(memoryAllocateFailed) {dosomething;}

catch(readFailed) {dosomething;}

catch() {dosomething;}

finally {dosomething;}}第6章異常處理機制

一、例外的概念例外機制的優(yōu)點:把錯誤處理代碼從常規(guī)代碼中分離出來按錯誤類型和差別分組(類Exception,派生)對無法預(yù)測的錯誤的捕獲和處理(基類)克服了傳統(tǒng)方法的錯誤信息有限的問題(getMessage)把錯誤傳播給調(diào)用堆棧(比較:全局變量,返回值)method1method2method3method4探測拋出例外傳遞捕獲處理例外調(diào)用第6章異常處理機制

一、例外的概念什么情況下使用例外機制?當(dāng)方法因為自身無法控制的原因而不能完成其任務(wù)如:文件不存在,網(wǎng)絡(luò)連接無法建立……

處理在方法、類庫、類中拋出的例外如產(chǎn)生IOException

在大的項目中采用統(tǒng)一的方式處理錯誤時如編寫一個文字處理器例外應(yīng)該是不經(jīng)常發(fā)生但卻可能發(fā)生的故障如:一定發(fā)生的事件不應(yīng)該用例外機制來處理例外處理用于使系統(tǒng)從故障中恢復(fù)如:提示信息/不產(chǎn)生無效的結(jié)果/釋放資源第6章異常處理機制

一、例外的概念不同的例外處理策略關(guān)鍵性應(yīng)用(處理所有例外)實驗軟件(可以忽略許多例外)處理例外時的注意事項終止程序會導(dǎo)致資源泄漏,利用例外處理釋放資源盡可能近地處理例外,這樣程序清晰易讀能在局部處理的錯誤不要使用例外機制例外機制的處理比正常處理效率低第6章異常處理機制

一、例外的概念例外機制的關(guān)鍵步驟try{…}定義可能產(chǎn)生例外的代碼段catch(Etypee){…}用于捕獲一個例外finally{…}用于做統(tǒng)一的事后處理,如釋放資源throwe;用于拋出一個例外throwsEtype1,Etype2……用于聲明方法可能拋出的例外類型第6章異常處理機制

一、例外的概念

程序中的例外不外乎兩種情況:一種是運行環(huán)境不能滿足程序運行的要求而出錯;一種是程序要解決的問題的約束而導(dǎo)致的。不管是哪種情況,編寫程序時,程序員要考慮到程序運行時可能遇到的各種情況(條件),并進行處理;如果不能處理,或者不知該如何處理,就可以認(rèn)為是一種錯誤,這時,就需要交給別人去處理。Java中,是通過例外機制通知別人出錯信息例外機制與常規(guī)的錯誤處理方法的不同之處在于:1、錯誤的表示方法:錯誤編碼

對象2、錯誤處理方法:與常規(guī)代碼的分離、錯誤傳遞機制第6章異常處理機制

二、例外的分類

一個例外是由一個對象來代表的,所有的例外都直接或間接地繼承自Throwable類。在Java類庫的每個類包中都定義了例外類,這些例外類分成兩大類:Error類及Exception類,后者是Java程序中需要大量處理的。除了Java類庫所定義的例外類之外,用戶也可以通過繼承已有的例外類來定義自己的例外類,并在程序中使用(利用throw產(chǎn)生,throws聲明拋出,catch捕捉并處理)。第6章異常處理機制

二、例外的分類Error:由Java虛擬機生成并拋出,包括動態(tài)鏈接失敗、虛擬機錯誤等,Java程序不做處理。

RuntimeException:Java虛擬機在運行時生成的例外,如被0除等系統(tǒng)錯誤、數(shù)組下標(biāo)超范圍等,其產(chǎn)生比較頻繁,處理麻煩,對程序可讀性和運行效率影響太大。因此由系統(tǒng)檢測,用戶可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(當(dāng)然,必要時,用戶可對其處理)。

Exception:一般程序中可預(yù)知的問題,其產(chǎn)生的例外可能會帶來意想不到的結(jié)果,因此Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常。第6章異常處理機制

二、例外的分類ThrowableErrorExceptionRuntimeException缺省的例外處理程序由用戶捕獲或聲明并處理不做處理用戶自己產(chǎn)生的例外處理第6章異常處理機制

二、例外的分類1、Throwable類的方法:

Throwable()Throwable(Stringmessage)StringtoString():返回一個包含異常描述的String對象

StringgetMessage():獲得標(biāo)準(zhǔn)錯誤信息

StringgetLocalizedMessage()voidprintStackTrace():顯示堆棧跟蹤記錄

voidprintStackTrace(PrintStream

s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()第6章異常處理機制

二、例外的分類參見ThrowableTest.javaThrowableTest1.java2、一些常用的例外Error(java.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)第6章異常處理機制

二、例外的分類Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException第6章異常處理機制

二、例外的分類RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)第6章異常處理機制

二、例外的分類ExceptionIOException(injava.io)CharConversionExceptionEOFException

InterruptedIOException……第6章異常處理機制

二、例外的分類原則:(1)編譯時例外:在程序中必須對其進行處理,否則編譯器會指出錯誤。在使用能夠產(chǎn)生異常的方法而沒有捕獲和處理,程序?qū)⒉荒芡ㄟ^編譯。(2)運行時例外:程序中可以不做處理,直接由運行時系統(tǒng)來處理。第6章異常處理機制

三、捕獲例外

Java的例外處理是通過3個關(guān)鍵詞來實現(xiàn)的:try-catch-finally。用try來監(jiān)視執(zhí)行一段程序,如果出現(xiàn)例外,系統(tǒng)就會拋出(throws)例外,可以通過例外的類型來捕捉(catch)并處理它,或最后(finally)由缺省處理方法來處理。第6章異常處理機制

三、捕獲例外try代碼段包含可能產(chǎn)生例外的代碼try代碼段后跟有一個或多個catch代碼段每個catch代碼段聲明其能處理的一種特定類型的例外每個catch代碼段都是一段例外處理代碼程序繼續(xù)執(zhí)行最后一個catch代碼段后的代碼

(或執(zhí)行完finally代碼段后)不同的代碼段是不同的作用域,不可訪問相互之間定義的局部變量第6章異常處理機制

三、捕獲例外try{/*接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生的異常,由catch中指定的程序處理;*/}//不能有其它語句分隔catch(要處理的異常種類和標(biāo)識符){//處理異常;}catch(要處理的異常種類和標(biāo)識符){//處理異常;}…finally{//最終處理(缺省處理),必須執(zhí)行;}…//OtherStatements第6章異常處理機制

三、捕獲例外1)try語句捕獲例外的第一步就是用try{…}語句指定了一段代碼,該段代碼就是一次捕獲并處理例外的范圍。在執(zhí)行過程中,該段代碼可能會產(chǎn)生并拋棄一個或多個例外,因此,它后面的catch語句進行捕獲時也要做相應(yīng)的處理。如果沒有例外產(chǎn)生,所有的catch代碼段都被略過不執(zhí)行。2)catch語句每個try語句必須伴隨一個或多個catch語句,用于捕獲try代碼塊所產(chǎn)生的例外并做相應(yīng)的處理。catch語句有一個形式參數(shù),用于指明其所能捕獲得例外類型,運行時系統(tǒng)通過參數(shù)值把被拋出的例外對象傳遞給catch語句。第6章異常處理機制

三、捕獲例外

程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的例外處理類型,一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理,盡量避免選擇最一般的類型作為catch語句中指定要捕獲的類型。當(dāng)然也可以用一個catch語句處理多個例外類型,這時它的例外類型應(yīng)該是這多個例外類型的父類,但這種方式使得在程序中不能確切判斷例外的具體類型。參見ExcDemo1.javaExcDemo2.javaExceptionExample.java第6章異常處理機制

三、捕獲例外

捕獲異常的好處是防止程序非正常終止。當(dāng)拋出異常時,如果不捕獲這些異常,那就會被虛擬機JVM捕獲。此時默認(rèn)的異常處理程序會終止執(zhí)行,并顯示一個堆棧跟蹤和錯誤信息,但這些信息并不是別人愿意看到的。使程序?qū)﹀e誤做出反應(yīng)并繼續(xù)執(zhí)行是異常處理的另一個好處。例外處理的查找依據(jù)類型匹配原則順序進行,第一個匹配的例外處理被執(zhí)行,當(dāng)例外處理執(zhí)行完畢,程序接著最后一個catch代碼段后的語句執(zhí)行。如果不相符,異常就不會被捕獲。參見ExcTypeMismatch.java第6章異常處理機制

三、捕獲例外

在例外處理中無法訪問try代碼段中聲明的變量。因為此時try代碼段已經(jīng)退出了,例外處理所需要的任何信息一般都應(yīng)該通過例外對象來傳遞。一旦處理完例外,系統(tǒng)就刪除它。參見ExcDemo3.java

盡量避免用一般類型作為catch中指定要捕獲的類型。一般應(yīng)該按照try代碼塊中例外可能產(chǎn)生的順序及其真正類型進行捕獲和處理??梢允褂枚鄠€catch語句,這樣每個catch語句必須捕獲一個不同類型的例外。參見ExcDemo4.javaExceptionDemo.java第6章異常處理機制

三、捕獲例外

例外處理的順序影響到例外的處理。子類例外可被父類例外處理捕獲。不要先捕獲父類例外,再捕獲子類例外。因為將父類放在前面,將永遠(yuǎn)不執(zhí)行子類語句。參見ExcDemo5.java

允許使用嵌套的try語句。由內(nèi)部try代碼塊產(chǎn)生的異常如果沒有與該try語句塊相關(guān)的catch捕獲,則被傳送到外部try語句塊。內(nèi)部的例外處理允許程序繼續(xù)運行,而外部try捕獲的例外使程序終止。通常嵌套try代碼塊用于以不同方式處理不同類型的錯誤,可以使用外部的try語句塊捕獲嚴(yán)重的錯誤,使用內(nèi)部try語句塊處理輕微的錯誤。參見NestTrys.java第6章異常處理機制

三、捕獲例外3)finally語句捕獲例外的最后一步是通過finally語句為例外處理提供一個統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。無論try所指定的程序塊中是否拋出例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。通常在finally語句中可以進行資源的清除工作,如關(guān)閉打開的文件、刪除臨時文件等。參見ExcDemo6.java第6章異常處理機制

四、聲明例外

如果在一個方法中生成了一個例外,但是這一方法并不確切地知道該如何對這一異常事件進行處理,這時,一個方法就應(yīng)該聲明拋棄例外,使得例外對象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。

聲明拋棄例外是在一個方法聲明中的throws子句中指明的。throws子句中同時可以指明多個例外,說明該方法將不對這些例外進行處理,而是聲明拋棄它們,之間由逗號隔開。聲明拋棄(throws)例外是一種消極的例外處理機制。這是相對于try-catch這種積極的例外處理機制而言。

需要強調(diào)的是:對于非運行時例外,程序中必須要作處理,或者捕獲,或者聲明拋棄;而對于運行時例外,程序中則可不處理。第6章異常處理機制

四、聲明例外Exception類定義可能遇到的輕微錯誤,分為派生自RuntimeExceptio類的異常和非派生自RuntimeException類的異常。這時,可以寫代碼來處理異常并繼續(xù)程序執(zhí)行,而不是讓程序中斷。區(qū)分RuntimeException和非RuntimeException的規(guī)則是:編程錯誤導(dǎo)致RuntimeException,如被零除、數(shù)組越界訪問、空指針訪問等;而其他異常則是由于意外情況而發(fā)生的,如試圖讀取文件結(jié)尾以后的數(shù)據(jù)、試圖打開錯誤的URL、試圖根據(jù)并不代表已存在類的字符串來查找Class對象等。第6章異常處理機制

四、聲明例外

因此,凡是RuntimeException及其子類的異常,可不必在聲明拋棄異常。所有其它類型的異常都需要聲明,若沒有,則引起編譯錯誤。編譯器檢查程序,保證所有非運行時例外都被程序顯式地處理.參見ThrowsDemo.javaThrowableErrorExceptionRuntimeException第6章異常處理機制

五、拋出例外

聲明例外首先必須生成例外。前面所提到的例外或者是由Java虛擬機生成,或者是由Java類庫中的某些類生成。事實上,在程序中也可以生成自己的例外對象,即例外可以不是出錯產(chǎn)生,而是人為地拋出。拋出例外就是產(chǎn)生例外對象的過程,首先要生成例外對象。在方法中,拋出例外對象是通過throw語句實現(xiàn)的。大多數(shù)情況下,所拋出的異常都是自己創(chuàng)建的異常類實例??梢話伋龅睦獗仨毷荰hrowable或其子類的實例。基本類型及非Throwable類對象不能用作異常。有二種方式可用于異常:在catch中使用參數(shù)或用new運算符創(chuàng)建。參見ThrowDemo.java第6章異常處理機制

五、拋出例外

由一個catch語句捕獲的異??梢灾匦聮伋鲆允雇獠康腸atch可以捕獲它。出現(xiàn)拋出的原因使為了允許多重程序訪問異常,例如一個異常

溫馨提示

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

最新文檔

評論

0/150

提交評論