異常處理總結(jié)_第1頁
異常處理總結(jié)_第2頁
異常處理總結(jié)_第3頁
異常處理總結(jié)_第4頁
異常處理總結(jié)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、異常處理1、為什么要引入異常處理機(jī)制我們的程序在編譯或運(yùn)行時可能會出問題,當(dāng)出現(xiàn)問題的時候程序就死掉了,這樣的程序健壯性不好。因此在JAVA中我們引入了異常處理機(jī)制,既保證能及時 發(fā)現(xiàn)問題并加以糾正,又能保證程序不死掉。JAVA中保證程序健壯性的方式有三種:垃圾回收機(jī)制(保證不會發(fā)生內(nèi)存泄露)棄用指針(保證不能直接對底層進(jìn)行操作)異常處理機(jī)制(保證程序不會因發(fā)生異常而死掉)2、什么是異常處理機(jī)制2.1、異常的定義程序問題的分類:錯誤(Error):嚴(yán)重的錯誤,無法通過修改代碼來處理。如JVM運(yùn)行失敗、線程池出錯導(dǎo)致JVM無法正確運(yùn)行。異常(Exceptio n):異常表示程序執(zhí)行過程中出現(xiàn)的不

2、正常的現(xiàn)象,可以通 過修改代碼來進(jìn)行彌補(bǔ)。異常的分類:運(yùn)行時異常(unchecked):運(yùn)行時異常都是RuntimeException類及 其子類異常,如 NullPointerException 、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤 引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。編譯時異常(checked):編譯時異常是 RuntimeException以外的異 常,類型上都屬于Exception類及其子類。從程序語法角度講是必 須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。

3、如IOException、SQLException 等以及用戶自定義的 Exception 異常,一般情況下不自定義檢查異常。異常處理的順序:引發(fā)異常(檢測異常情況并生成異常的過程叫引發(fā)異常)捕獲異常(當(dāng)異常被引發(fā)時,可被處理程序捕獲)處理異常(上面的兩個過程總稱為處理異常)2.2、異常的捕獲和處理機(jī)制Java異常處理涉及到五個關(guān)鍵字, 分別是:try、catch、fin ally 、throw、throws一個異常處理塊的通常語法形式:Try/可能引發(fā)異常的語句Catch(Excepti on Typel ex)/獲得此類異常信息并處理異常的代碼Catch(Excepti on Type2

4、ex)/獲得此類異常信息并處理異常的代碼(注意:Catch塊的放置順序,捕獲子類異常放前面,捕獲父類異常放后面)Fin ally/ 一般為釋放資源的語句以上語法有三個代碼塊:try語句塊,表示要嘗試運(yùn)行代碼,try語句塊中代碼受異常監(jiān)控,其中代碼發(fā)生異常時,會拋出異常對象。異常處理的代碼執(zhí)行順序有兩種不發(fā)生異常時:執(zhí)行完Try塊里的語句后跳過Catch塊,執(zhí)行Fin ally里面的語 句;若Try塊中有return語句是,先執(zhí)行Fin ally 里的語句, 再執(zhí)行return ;若Try塊中有Sistem.exit() 語句時將直接結(jié)束 程序,不執(zhí)行Fin ally 里的語句。當(dāng)發(fā)生異常時:c

5、atch語句帶一個Throwable類型的參數(shù),表示可捕獲異常類型。 當(dāng)try中出現(xiàn)異常時,catch會捕獲到發(fā)生的異常,并和自己的 異常類型匹配,若匹配,則執(zhí)行 catch塊中代碼,并將catch 塊參數(shù)指向所拋的異常對象。catch語句可以有多個,用來匹配多個中的一個異常,一旦匹配 上后,就不再嘗試匹配別的catch塊了。通過異常對象可以獲取 異常發(fā)生時完整的JVM堆棧信息,以及異常信息和異常發(fā)生的 原因等。fin ally語句塊是緊跟catch語句后的語句塊,這個語句塊總是會在方法返回前執(zhí)行,而不管是否try語句塊是否發(fā)生異常。并 且這個語句塊總是在方法返回前執(zhí)行。目的是給程序一個補(bǔ)救的

6、 機(jī)會。這樣做也體現(xiàn)Java語言的健壯性。Try Catch Fin ally使用時應(yīng)注意的問題:try、catch、fin ally三個語句塊均不能單獨(dú)使用,三者可以組成try.catch.finally、try.catch、try.finally三種結(jié)構(gòu),catch語句可以有一個或多個,fin ally語句最多一個。try、catch、fin ally 三個代碼塊中變量的作用域為代碼塊內(nèi)部,分別 獨(dú)立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定 義到這些塊的外面。多個catch塊時候,只會匹配其中一個異常類并執(zhí)行catch塊代碼,而不會再執(zhí)行別的catch塊,并且匹配catc

7、h語句的順序是由上到下。throw、throws關(guān)鍵字的用法和對比:throw關(guān)鍵字是用于方法體內(nèi)部,用來拋出一個Throwable類型的異常。 如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類 型。該方法的調(diào)用者也必須檢查處理拋出的異常。如果所有方法都層層 上拋獲取的異常,最終JVM會進(jìn)行處理,處理也很簡單,就是打印異常 消息和堆棧信息。如果拋出的是 Error或RuntimeException,則該方法 的調(diào)用者可選擇處理該異常。throws關(guān)鍵字用于方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當(dāng)拋出了檢查異常,該方法的調(diào)用者才必須處理或者重 新拋出該異常。當(dāng)

8、方法的調(diào)用者無力處理該異常的時候,應(yīng)該繼續(xù)拋出, 而不是囫圇吞棗一般在catch塊中打印一下堆棧信息做個勉強(qiáng)處理。一般來說,寫了 throw 一定要寫throws,而寫了 throws不一定要寫throw。throw、throws關(guān)鍵字的用法舉例:public static void test() throws Excepti on/拋出一個檢查異常throw new Exception(” 方法 test 中的 Exception);關(guān)于異常類:異常類是和其他類一樣的類,java.la ng.Throwable類是所有異常類的根類java.lang.Throwable類有兩個擴(kuò)展類,分別是

9、Error類和Exception類JAVA中大多數(shù)異常類都使用Exception類Java異常體系結(jié)構(gòu)圖Java的Java.lang中定義的運(yùn)行時異常異常說明ArithmeticExceptio n算術(shù)錯誤,比如被0除Arrayl ndexOutOfBo un dsExceptio n數(shù)組下標(biāo)出界ArrayStoreExcepti on數(shù)組元素賦值類型不兼容ClassCastExceptio n非法強(qiáng)制轉(zhuǎn)換類型IllegalArgume ntExceptio n調(diào)用方法的參數(shù)非法IllegalMo ni torStateExceptio n非法監(jiān)控操作,如等待一個未鎖定線程IllegalSta

10、teExcepti on環(huán)境或應(yīng)用狀態(tài)不正確IllegalTheadStateExcepti on請求操作與當(dāng)前線程狀態(tài)不兼容In dexOutBo un dsExcepti on某些類型索引越界NullPoi nterExceptio n非法使用空引用NumberFormatExcepti on字符串到數(shù)字格式非法轉(zhuǎn)換SecurityExcepti on試圖違反安全性Stri ngI ndexOurOfBo unds試圖在字符串邊界之外索引Un surpportedOperatio nExcepti on遇到不支持的操作Java的Java.lang中定義的編譯時異常異常說明ClassNotF

11、 oun dExcepti on找不到類Clo neNotSupportedExceptio n試圖克隆不能實現(xiàn)Clo neable接口的對象IllegalAccessExcepti on對一個類的訪問被拒絕In sta ntiatio nExceptio n試圖創(chuàng)建一個抽象類或抽象接口的對象In terruptedExceptio n一個線程被另一個線程中斷NoSuchFieldExceptio n請求的字段不存在NoSuchMethodExceptio n請求的方法不存在Throwable類中常用的核心方法方法描述Throwable fillI nStackTrace()填充該執(zhí)行堆棧跟蹤

12、String getLocalizedMessage()創(chuàng)建該可引發(fā)類的本地化描述String getMessage()返回該可引發(fā)對象的錯誤消息字符串Void prin tStackTrace將可引發(fā)類及其反向跟蹤打印到標(biāo)準(zhǔn) 錯誤輸出流Void printStackTrace(PrintStreams)將該可引發(fā)類及其反向跟蹤打印到指 定的打印流Voidprin tStackTrace(Pri ntWriter將該可引發(fā)類及其反向跟蹤打印到指s)定的打印機(jī)Stri ng toStri ng返回關(guān)于該可引發(fā)類的簡短描述2.3、異常處理的一般原則能處理就早處理,拋出不去還不能處理的就想法消化掉或

13、者轉(zhuǎn)換為RuntimeException處理。因為對于一個應(yīng)用系統(tǒng)來說,拋出大量異常是有問 題的,應(yīng)該從程序開發(fā)角度盡可能的控制異常發(fā)生的可能。對于檢查異常,如果不能行之有效的處理,還不如轉(zhuǎn)換為RuntimeException 拋出。這樣也讓上層的代碼有選擇的余地可處理也可不處理。對于一個應(yīng)用系統(tǒng)來說,應(yīng)該有自己的一套異常處理框架,這樣當(dāng)異常發(fā)生時,也能得到統(tǒng)一的處理風(fēng)格,將優(yōu)雅的異常信息反饋給用戶。2.4、異常的轉(zhuǎn)義與異常鏈所謂的異常轉(zhuǎn)譯就是將一種異常轉(zhuǎn)換另一種新的異常,也許這種新的異常更 能準(zhǔn)確表達(dá)程序發(fā)生異常。在Java中有個概念就是異常原因,異常原因?qū)е庐?dāng)前拋出異常的那個異 常對象,幾

14、乎所有帶異常原因的異常構(gòu)造方法都使用Throwable類型做參數(shù),這也就為轉(zhuǎn)義異常提供了直接的支持,因為任何形式的異常和錯 誤都是Throwable的子類。比如將SQLException轉(zhuǎn)換為另外一個新的 異常DAOException,可以這么寫:先自定義一個異常DAOException:public class DAOExceptio n exte nds Run timeExcepti on /( 一般來說都要寫一下4個構(gòu)造方法)public DAOExceptio n() super();public DAOExceptio n( Excepti on ex) super(Excepti

15、 on ex);public DAOExceptio n(Throwable th) super(Throwable th);public DAOExceptio n(Stri ng str) super(Stri ng str);比如有一個SQLException類型的異常對象e,要轉(zhuǎn)換為DAOException, 可以這么寫:DAOException daoEx = newDAOExceptio n( SQL 異常e);異常鏈顧名思義就是將異常發(fā)生的原因一個傳一個串起來,即把底層的異常信息傳給上層,這樣逐層拋出。當(dāng)程序捕獲到了一個底層異常le,在處理部分選擇了繼續(xù)拋出一個更高 級別的新異常

16、給此方法的調(diào)用者。這樣異常的原因就會逐層傳遞。這樣,位于高層的異常遞歸調(diào)用getCause()方法,就可以遍歷各層的異常原 因。這就是Java異常鏈的原理。異常鏈的實際應(yīng)用很少,發(fā)生異常時候 逐層上拋不是個好注意,上層拿到這些異常又能奈之何?而且異常逐層 上拋會消耗大量資源,因為要保存一個完整的異常鏈信息。3、設(shè)計一個高效合理的異常處理框架對于一個應(yīng)用系統(tǒng)來說,發(fā)生所有異常在用戶看來都是應(yīng)用系統(tǒng)內(nèi)部的異常。因此應(yīng)該設(shè)計一套應(yīng)用系統(tǒng)的異常框架,以處理系統(tǒng)運(yùn)行過程中的所有異常?;谶@種觀點(diǎn),可以設(shè)計一個應(yīng)用系統(tǒng)的異常比如叫做 AppException。并且對用戶來說,這些異常都是運(yùn)行應(yīng)用系統(tǒng)運(yùn)行時

17、發(fā)生的,因此AppException應(yīng)該繼承RuntimeException ,這樣系統(tǒng)中所有的其他異常都轉(zhuǎn)譯為 AppException, 當(dāng)異常發(fā)生的時候,前 端接收到AppExcetpion并做統(tǒng)一的處理。畫出異常處理 框架如下圖:AppRunT imeEHception捕荻處理異常信息業(yè)務(wù)異當(dāng)涎類R unt i m EException77fSomeErrorApptheckedEKceptionAppDAO&cceptionOtherEKceptian轉(zhuǎn)換”轉(zhuǎn)換/Hibe r nd t eEce pti onSQLEHcetpionI SubOthetEKcephon A I一個應(yīng)用

18、系統(tǒng)的異常處理框架在這個設(shè)計圖中,AppRuntimeException是系統(tǒng)異常的基類,對外只拋出這 個異常,這個異常可以由前端(客戶端)接收處理,當(dāng)異常發(fā)生時,客戶端的相關(guān)組件捕獲并處理這些異常,將友好的信息展示給客戶。在AppRuntimeException下層,有各種各樣的異常和錯誤,最終都轉(zhuǎn)譯為 AppRuntimeException,AppRuntimeException 下面還可以設(shè)計一些別的子類異 常,比如 AppDAOException OtherException等,這些都根據(jù)實際需要靈活處 理。在往下就是如何將捕獲的原始異常比如SQLException、HibernateException轉(zhuǎn)換為更高級一點(diǎn)AppDAOExceptior。有關(guān)異常框架設(shè)計這方面公認(rèn)比較好的就是Spring , Spring中

溫馨提示

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

評論

0/150

提交評論