



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
異常異常體系E^end在這里插入圖片描述RlintiTieExceDtion其他&xcepitcn:;g異常體系E^end在這里插入圖片描述RlintiTieExceDtion其他&xcepitcn:;g檢)「rowableExceDtic^ExtendsExte-ics~x:ends~x:erdsErrcr,曳擬機(jī)Error與ExceptionError是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath、NoClassDefFoundError等。這些異常發(fā)生時,Java虛擬機(jī)(JVM)一般會選擇線程終止。Exception是程序本身可以處理的異常,這種異常分兩大類運(yùn)行時異常和非運(yùn)行時異常。程序中應(yīng)當(dāng)盡可能去處理這些異常,使程序繼續(xù)正常運(yùn)行。Exception運(yùn)行時異常運(yùn)行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起,程序應(yīng)從邏輯角度盡可能避免這類異常的發(fā)生,一旦發(fā)生程序一般沒有按照錯誤邏輯運(yùn)行下去的必要。非運(yùn)行時異常非運(yùn)行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如lOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。受檢異常一般是與程序與外界交互失敗才會拋出,希望可以處理使程序正常運(yùn)行。Throwable類中的常用方法getCause():返回拋出異常的原因。如果cause不存在或未知,則返回null。getMessageQ:返回異常的消息信息。printStackTrace():對象的堆棧跟蹤輸出至錯誤輸出流,作為字段System.err的值。try、catch、finally三個語句塊應(yīng)注意的問題第一、try、catch、finally三個語句塊均不能單獨(dú)使用,三者可以組成try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語句可以有一個或多個,finally語句最多一個。第二、try、catch、finally三個代碼塊中變量的作用域?yàn)榇a塊內(nèi)部,分別獨(dú)立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。第三、多個catch塊時候,只會匹配其中一個異常類并執(zhí)行catch塊代碼,而不會再執(zhí)行別的catch塊,并且匹配catch語句的順序是由上到下。throw、throws關(guān)鍵字throw關(guān)鍵字是用于方法體內(nèi)部,用來拋出一個Throwable類型的異常。如果所有方法都層層上拋獲取的異常,最終JVM會進(jìn)行處理,處理也很簡單,就是打印異常消息和堆棧信息。如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類型。該方法的調(diào)用者也必須檢查處理拋出的異常。如果拋出的是Error或RuntimeException,則該方法的調(diào)用者可選擇處理該異常。throws關(guān)鍵字用于方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當(dāng)拋出了檢查異常,該方法的調(diào)用者才必須處理或者重新拋出該異常。當(dāng)方法的調(diào)用者無力處理該異常的時候,應(yīng)該繼續(xù)拋出,而不是囫圇吞棗一般在catch塊中打印一下堆棧信息做個勉強(qiáng)處理。異常處理的一般原則能處理就早處理。因?yàn)閷τ谝粋€應(yīng)用系統(tǒng)來說,拋出大量異常是有問題的,應(yīng)該從程序開發(fā)角度盡可能的控制異常發(fā)生的可能。異常能處理就處理,不能處理就拋出,不要catch后不處理,最終沒有處理的異常JVM會進(jìn)行處理對于檢查異常,throws還是catch,應(yīng)該根據(jù)具體業(yè)務(wù)場景決定,如果希望上層知道則應(yīng)throwso對于一個應(yīng)用系統(tǒng)來說,如果不能有效的處理受檢異常,可以轉(zhuǎn)譯轉(zhuǎn)換為更加符合業(yè)務(wù)場景的RuntimeException拋出。上層的代碼決定是否處理。對于一個應(yīng)用系統(tǒng)來說,應(yīng)該有自己的一套異常規(guī)范,當(dāng)異常發(fā)生時,可以是統(tǒng)一的處理風(fēng)格,將優(yōu)雅的異常信息反饋給用戶。系統(tǒng)異常設(shè)計(jì)原則理論:異常轉(zhuǎn)譯將一種異常轉(zhuǎn)換另一種新的異常,也許這種新的異常更能準(zhǔn)確表達(dá)程序發(fā)生異常。在JDK中也是,幾乎所有帶異常原因的異常構(gòu)造方法,都使用Throwable類型做參數(shù)將其包裝一層實(shí)現(xiàn)轉(zhuǎn)譯,這也就為異常的轉(zhuǎn)譯提供了直接的支持。比如將SQLException轉(zhuǎn)換為另外一個新的異常DAOException。理論:異常傳播(異常鏈)將異常發(fā)生的原因一個傳一個串起來,即把底層的異常信息傳給上層,這樣逐層拋出。try{lowLevelOp();}catch(LowLevelExceptionle){thrownewHighLevelException(le)}在處理部分選擇了繼續(xù)拋出一個更高級別的新異常給此方法的調(diào)用者。這樣異常的原因就會逐層傳遞。這樣,位于高層的異常遞歸調(diào)用getCause()方法,就可以遍歷各層的異常原因。異常鏈的實(shí)際應(yīng)用很少,發(fā)生異常時候逐層上拋不是個好注意,上層拿到這些異常又能奈之何?而且異常逐層上拋會消耗大量資源,因?yàn)橐4嬉粋€完整的異常鏈信息對外統(tǒng)一暴露異?;愊到y(tǒng)異常的基類,對外以及對上層只拋出這個異常的子類,建立統(tǒng)一的異常拋出體系,從而可以更加準(zhǔn)確的根據(jù)業(yè)務(wù)場景轉(zhuǎn)譯異常。同時實(shí)現(xiàn)了對外暴露統(tǒng)一的異常,可以使用切面攔截處理,或者拋給前端接收處理,因?yàn)槎际峭环N異常,所以可以將“友好”的信息展示給客戶。有關(guān)異常框架設(shè)計(jì)這方面公認(rèn)比較好的就是Spring,Spring中的所有異常都可以用org.springframework.core.NestedRuntimeException來表示,其繼承的是RuntimeException。同時也會給每個拋出的自定義運(yùn)行時異常,在其方法簽名上throws然后用注釋說明。Spring框架很龐大,因此設(shè)計(jì)了很多NestedRuntimeException的子類,還有異常轉(zhuǎn)換的工具補(bǔ)充什么時候捕獲異常,捕獲之后怎么處理受檢異常時,能處理就處理,處理不了轉(zhuǎn)譯為系統(tǒng)異常體系的符合當(dāng)前場景的運(yùn)行時異常往上拋,然后在方法簽名上throws該異常,并加注釋說明,讓上層代碼決定是否處理classnotfoundexception和noclassdeffounderror主要還是類找不到的時機(jī)不同,一個是通過反射調(diào)用加載類,一個是jvm由于鏈接時需要類加載找不到classnotfoundexception:JDK中的解釋是:當(dāng)應(yīng)用程序視圖使用以下方法通過字符串加載類時,沒有在classpath中查找到執(zhí)行的類,那么就會拋出ClassNotFoundException。 (1)Class類中的forName()方法(2)ClassLoader類中的findSystemClass方法(3)ClassLoader類中的loadClass方法。還有根據(jù)類加載器的可見性機(jī)制,子類加載器可以看到父類加載器加載的類,而反之則不行。所以當(dāng)一個類已經(jīng)被子類加載器加載,再用父類加載器加載時,將會拋出java.lang.ClassNotFoundException異常。noclassdeffounderror:要找的類在編譯時期還可以找到,但是在運(yùn)行java應(yīng)用的時候找不到了,這比較經(jīng)常出現(xiàn)在靜態(tài)塊的初始化過程中。JDK官方的解釋:當(dāng)虛擬機(jī)或ClassLoader實(shí)例在類的定義中加載(作為通用方法調(diào)用的一部分或者作為new表達(dá)式創(chuàng)建的新實(shí)例的一部分),但是無法找到該類的定義時,拋出此異常。當(dāng)前執(zhí)行的類被編譯時,所搜索的類定義存在,但無法再找到該定義。ClassNotFountException異常,怎么解決,分析為什么會出現(xiàn)檢查全限定類名檢查環(huán)境變量classpath的配置,看一看所需要的支持類庫是否放在classpath路徑里面檢查是否使用了重復(fù)的類庫,且版本不一致,導(dǎo)致錯誤版本被優(yōu)先使用jar包沖突導(dǎo)致類找不到(ClassNotFountException、noclass
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021-2022學(xué)年廣東省廣州市南武教育集團(tuán)七年級(下)期中數(shù)學(xué)試卷(含答案)
- 遺產(chǎn)繼承顧問服務(wù)合同(2篇)
- 環(huán)保工程承包與實(shí)施合同
- 樣機(jī)報(bào)廢說明
- 電子會議參與情況統(tǒng)計(jì)表
- 四川省達(dá)州市渠縣中學(xué)2025屆高三下學(xué)期二??荚嚨乩碓囶}(含答案)
- 汽車維修技術(shù)發(fā)動機(jī)原理與故障診斷試題
- 在公司年會上的致辭報(bào)告
- 《光的三原色原理及其應(yīng)用:初中物理教學(xué)教案》
- 物流行業(yè)貨物運(yùn)輸延誤免責(zé)協(xié)議書
- 2023年浙江農(nóng)商聯(lián)合銀行招聘考試真題
- 主任臨床查房程序規(guī)范及評分標(biāo)準(zhǔn)
- 工業(yè)氣體分離技術(shù)與設(shè)備管理手冊
- 汽車底盤課件 課題7 行駛系統(tǒng)概述
- 小學(xué)教師讀書分享活動課件
- 《一橋飛架連天塹》課件 2024-2025學(xué)年嶺南美版 (2024)初中美術(shù)七年級上冊
- 《經(jīng)濟(jì)法學(xué)》(第三版)電子教案
- 營地布景規(guī)劃方案
- 《線性代數(shù)》全套教學(xué)課件
- 北京市企業(yè)考勤管理制度
- 2024年全國醫(yī)學(xué)考博英語試題
評論
0/150
提交評論