




已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java異常應(yīng)用指導(dǎo)本文是異常內(nèi)容的集大成者,力求全面,深入的異常知識(shí)研究與分析。本文由金絲燕網(wǎng)獨(dú)家撰寫(xiě),參考眾多網(wǎng)上資源,經(jīng)過(guò)內(nèi)容辨別取舍,文字格式校驗(yàn)等步驟編輯而成,以饗讀者。對(duì)于本文的內(nèi)容,建議小白需要多多思考力求掌握,對(duì)于老手只需意會(huì)溫故知新。對(duì)于本文的內(nèi)容,屬于基礎(chǔ)知識(shí)研究范疇,切勿以為讀完此文就能將異常知識(shí)掌握到家。切記:操千曲而后曉聲,觀千劍而后識(shí)器,所以我覺(jué)得沒(méi)有大量的源碼閱讀經(jīng)驗(yàn),你很難知道什么時(shí)候需要自定義異常,什么時(shí)候需要拋出異常。異常機(jī)制概述異常機(jī)制是指當(dāng)程序出現(xiàn)錯(cuò)誤后,程序如何處理。具體來(lái)說(shuō),異常機(jī)制提供了程序退出的安全通道。當(dāng)出現(xiàn)錯(cuò)誤后,程序執(zhí)行的流程發(fā)生改變,程序的控制權(quán)轉(zhuǎn)移到異常處理器。異常處理的流程當(dāng)程序中拋出一個(gè)異常后,程序從程序中導(dǎo)致異常的代碼處跳出,java虛擬機(jī)檢測(cè)尋找和try關(guān)鍵字匹配的處理該異常的catch塊,如果找到,將控制權(quán)交到catch塊中的代碼,然后繼續(xù)往下執(zhí)行程序,try塊中發(fā)生異常的代碼不會(huì)被重新執(zhí)行。如果沒(méi)有找到處理該異常的catch塊,在所有的finally塊代碼被執(zhí)行和當(dāng)前線程的所屬的ThreadGroup的uncaughtException方法被調(diào)用后,遇到異常的當(dāng)前線程被中止。異常的結(jié)構(gòu)異常的繼承結(jié)構(gòu):Throwable為基類(lèi),Error和Exception繼承Throwable,RuntimeException和IOException等繼承Exception。Error和RuntimeException及其子類(lèi)成為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。 Java異常的深入研究與分析(1)Error異常Error表示程序在運(yùn)行期間出現(xiàn)了十分嚴(yán)重、不可恢復(fù)的錯(cuò)誤,在這種情況下應(yīng)用程序只能中止運(yùn)行,例如JAVA 虛擬機(jī)出現(xiàn)錯(cuò)誤。Error是一種unchecked Exception,編譯器不會(huì)檢查Error是否被處理,在程序中不用捕獲Error類(lèi)型的異常。一般情況下,在程序中也不應(yīng)該拋出Error類(lèi)型的異常。RuntimeException異常Exception異常包括RuntimeException異常和其他非RuntimeException的異常。RuntimeException 是一種Unchecked Exception,即表示編譯器不會(huì)檢查程序是否對(duì)RuntimeException作了處理,在程序中不必捕獲RuntimException類(lèi)型的異常,也不必在方法體聲明拋出RuntimeException類(lèi)。RuntimeException發(fā)生的時(shí)候,表示程序中出現(xiàn)了編程錯(cuò)誤,所以應(yīng)該找出錯(cuò)誤修改程序,而不是去捕獲RuntimeException。Checked Exception異常Checked Exception異常,這也是在編程中使用最多的Exception,所有繼承自Exception并且不是RuntimeException的異常都是checked Exception,上圖中的IOException和ClassNotFoundException。JAVA 語(yǔ)言規(guī)定必須對(duì)checked Exception作處理,編譯器會(huì)對(duì)此作檢查,要么在方法體中聲明拋出checked Exception,要么使用catch語(yǔ)句捕獲checked Exception進(jìn)行處理,不然不能通過(guò)編譯。在聲明方法時(shí)候拋出異常語(yǔ)法:throws(略)為什么要在聲明方法拋出異常?方法是否拋出異常與方法返回值的類(lèi)型一樣重要。假設(shè)方法拋出異常卻沒(méi)有聲明該方法將拋出異常,那么客戶(hù)程序員 可以調(diào)用這個(gè)方法而且不用編寫(xiě)處理異常的代碼。那么,一旦出現(xiàn)異常,那么這個(gè)異常就沒(méi)有合適的異常控制器來(lái)解決。為什么拋出的異常一定是已檢查異常?RuntimeException與Error可以在任何代碼中產(chǎn)生,它們不需要由程序員顯示的拋出,一旦出現(xiàn)錯(cuò)誤,那么相應(yīng)的異常會(huì)被自動(dòng)拋出。遇到Error,程序員一般是無(wú)能為力的;遇到RuntimeException,那么一定是程序存在邏輯錯(cuò)誤,要對(duì)程序進(jìn)行修改;只有已檢查異常才是程序員所關(guān)心的,程序應(yīng)該且僅應(yīng)該拋出或處理已檢查異常。而已檢查異常是由程序員拋出的,這分為兩種情況:客戶(hù)程序員調(diào)用會(huì)拋出異常的庫(kù)函數(shù);客戶(hù)程序員自己使用throw語(yǔ)句拋出異常。注意:覆蓋父類(lèi)某方法的子類(lèi)方法不能拋出比父類(lèi)方法更多的異常,所以,有時(shí)設(shè)計(jì)父類(lèi)的方法時(shí)會(huì)聲明拋出異常,但實(shí)際的實(shí)現(xiàn)方法的代碼卻并不拋出異常,這樣做的目的就是為了方便子類(lèi)方法覆蓋父類(lèi)方法時(shí)可以拋出異常。在方法中如何拋出異常語(yǔ)法:throw(略)拋出什么異常?對(duì)于一個(gè)異常對(duì)象,真正有用的信息是異常的對(duì)象類(lèi)型,而異常對(duì)象本身毫無(wú)意義。比如一個(gè)異常對(duì)象的類(lèi)型是ClassCastException,那么這個(gè)類(lèi)名就是唯一有用的信息。所以,在選擇拋出什么異常時(shí),最關(guān)鍵的就是選擇異常的類(lèi)名能夠明確說(shuō)明異常情況的類(lèi)。異常對(duì)象通常有兩種構(gòu)造函數(shù):一種是無(wú)參數(shù)的構(gòu)造函數(shù);另一種是帶一個(gè)字符串的構(gòu)造函數(shù),這個(gè)字符串將作為這個(gè)異常對(duì)象除了類(lèi)型名以外的額外說(shuō)明。為什么要?jiǎng)?chuàng)建自己的異常?當(dāng)Java內(nèi)置的異常都不能明確的說(shuō)明異常情況的時(shí)候,需要?jiǎng)?chuàng)建自己的異常。需要注意的是,唯一有用的就是類(lèi)型名這個(gè)信息,所以不要在異常類(lèi)的設(shè)計(jì)上花費(fèi)精力。throw和throws的區(qū)別/* * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java! */public class TestThrow public static void main(String args) try /調(diào)用帶throws聲明的方法,必須顯式捕獲該異常 /否則,必須在main方法中再次聲明拋出 throwChecked(-3); catch (Exception e) System.out.println(e.getMessage(); /調(diào)用拋出Runtime異常的方法既可以顯式捕獲該異常, /也可不理會(huì)該異常 throwRuntime(3); public static void throwChecked(int a)throws Exception if (a 0) /自行拋出Exception異常 /該代碼必須處于try塊里,或處于帶throws聲明的方法中 throw new Exception(a的值大于0,不符合要求); public static void throwRuntime(int a) if (a 0) /自行拋出RuntimeException異常,既可以顯式捕獲該異常 /也可完全不理會(huì)該異常,把該異常交給該方法調(diào)用者處理 throw new RuntimeException(a的值大于0,不符合要求); 補(bǔ)充:throwChecked函數(shù)的另外一種寫(xiě)法如下所示:public static void throwChecked(int a) if (a 0) /自行拋出Exception異常 /該代碼必須處于try塊里,或處于帶throws聲明的方法中 try throw new Exception(a的值大于0,不符合要求); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); 注意:此時(shí)在main函數(shù)里面throwChecked就不用try異常了。應(yīng)該在聲明方法拋出異常還是在方法中捕獲異常?處理原則:捕捉并處理哪些知道如何處理的異常,而傳遞哪些不知道如何處理的異常使用finally塊釋放資源finally關(guān)鍵字保證無(wú)論程序使用任何方式離開(kāi)try塊,finally中的語(yǔ)句都會(huì)被執(zhí)行。在以下三種情況下會(huì)進(jìn)入finally塊:(1) try塊中的代碼正常執(zhí)行完畢。(2) 在try塊中拋出異常。(3) 在try塊中執(zhí)行return、break、continue。因此,當(dāng)你需要一個(gè)地方來(lái)執(zhí)行在任何情況下都必須執(zhí)行的代碼時(shí),就可以將這些代碼放入finally塊中。當(dāng)你的程序中使用了外界資源,如數(shù)據(jù)庫(kù)連接,文件等,必須將釋放這些資源的代碼寫(xiě)入finally塊中。必須注意的是:在finally塊中不能拋出異常。JAVA異常處理機(jī)制保證無(wú)論在任何情況下必須先執(zhí)行finally塊然后再離開(kāi)try塊,因此在try塊中發(fā)生異常的時(shí)候,JAVA虛擬機(jī)先轉(zhuǎn)到finally塊執(zhí)行finally塊中的代碼,finally塊執(zhí)行完畢后,再向外拋出異常。如果在finally塊中拋出異常,try塊捕捉的異常就不能拋出,外部捕捉到的異常就是finally塊中的異常信息,而try塊中發(fā)生的真正的異常堆棧信息則丟失了。請(qǐng)看下面的代碼:Connection con = null;try con = dataSource.getConnection(); catch(SQLException e) throw e;/進(jìn)行一些處理后再將數(shù)據(jù)庫(kù)異常拋出給調(diào)用者處理finally try con.close(); catch(SQLException e) e.printStackTrace(); 運(yùn)行程序后,調(diào)用者得到的信息如下java.lang.NullPointerExceptionat myPackage.MyClass.method1(methodl.java:266)而不是我們期望得到的數(shù)據(jù)庫(kù)異常。這是因?yàn)檫@里的con是null的關(guān)系,在finally語(yǔ)句中拋出了NullPointerException,在finally塊中增加對(duì)con是否為null的判斷可以避免產(chǎn)生這種情況。丟失的異常請(qǐng)看下面的代碼:public void method2()try method1(); /method1進(jìn)行了數(shù)據(jù)庫(kù)操作catch(SQLException e) throw new MyException(發(fā)生了數(shù)據(jù)庫(kù)異常:+e.getMessage);public void method3() try method2();catch(MyException e) e.printStackTrace(); 上面method2的代碼中,try塊捕獲method1拋出的數(shù)據(jù)庫(kù)異常SQLException后,拋出了新的自定義異常MyException。這段代碼是否并沒(méi)有什么問(wèn)題,但看一下控制臺(tái)的輸出:MyException:發(fā)生了數(shù)據(jù)庫(kù)異常:對(duì)象名稱(chēng)MyTable 無(wú)效。 at MyClass.method2(MyClass.java:232) at MyClass.method3(MyClass.java:255)原始異常SQLException的信息丟失了,這里只能看到method2里面定義的MyException的堆棧情況;而method1中發(fā)生的數(shù)據(jù)庫(kù)異常的堆棧則看不到,如何排錯(cuò)呢,只有在method1的代碼行中一行行去尋找數(shù)據(jù)庫(kù)操作語(yǔ)句了。JDK的開(kāi)發(fā)者們也意識(shí)到了這個(gè)情況,在JDK1.4.1中,Throwable類(lèi)增加了兩個(gè)構(gòu)造方法,public Throwable(Throwable cause)和public Throwable(String message,Throwable cause),在構(gòu)造函數(shù)中傳入的原始異常堆棧信息將會(huì)在printStackTrace方法中打印出來(lái)。但對(duì)于還在使用JDK1.3的程序員,就只能自己實(shí)現(xiàn)打印原始異常堆棧信息的功能了。實(shí)現(xiàn)過(guò)程也很簡(jiǎn)單,只需要在自定義的異常類(lèi)中增加一個(gè)原始異常字段,在構(gòu)造函數(shù)中傳入原始異常,然后重載printStackTrace方法,首先調(diào)用類(lèi)中保存的原始異常的printStackTrace方法,然后再調(diào)用super.printStackTrace方法就可以打印出原始異常信息了??梢赃@樣定義前面代碼中出現(xiàn)的MyException類(lèi):import java.io.PrintStream;import java.io.PrintWriter;public class MyException extends Exception private static final long serialVersionUID = 1L; /原始異常 private Throwable cause; /構(gòu)造函數(shù) public MyException(Throwable cause) this.cause = cause; public MyException(String s,Throwable cause) super(s); this.cause = cause; /重載printStackTrace方法,打印出原始異常堆棧信息 public void printStackTrace() if (cause != null)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)高壓高強(qiáng)免燒壓磚機(jī)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)錦綸高速紡絲油劑市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)避雷器漏電流及動(dòng)作記錄器市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)補(bǔ)給水裝置市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)聚酯纖維紙復(fù)合材料市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)立式瓷殼線繞電阻器市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)電腦天線市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)煤氣管材市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)潔具掛件市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)梨形瓶市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 建筑安裝工程一切險(xiǎn)宋
- 裝配電工技能培訓(xùn)課件
- 三菱通用變頻器D700使用手冊(cè)
- 分期付款合同協(xié)議
- 2017版銀皮書(shū)(中英文完整版)FIDIC設(shè)計(jì)采購(gòu)施工交鑰匙項(xiàng)目合同條件
- 關(guān)于社會(huì)調(diào)查報(bào)告范文十篇
- 公安機(jī)關(guān)業(yè)務(wù)技術(shù)用房建設(shè)標(biāo)準(zhǔn)
- GMP生產(chǎn)管理知識(shí)
- GB/T 9768-2017輪胎使用與保養(yǎng)規(guī)程
- GB/T 39880-2021疑似毒品中美沙酮檢驗(yàn)氣相色譜和氣相色譜-質(zhì)譜法
- 初中物理運(yùn)動(dòng)快慢計(jì)算題專(zhuān)題訓(xùn)練含答案
評(píng)論
0/150
提交評(píng)論