文章詳情頁
Java違例控制總結(jié)
瀏覽:77日期:2024-06-14 13:53:05
內(nèi)容: Java違例控制 總結(jié)Java違例控制 本文主要討論Java中的違例控制,包括以下內(nèi)容:1)什么是違例控制2)違例的概念3)Java中違例的類層次結(jié)構(gòu)4)如何擲出和捕獲違例5)捕獲以后如何處理違例本文將通過深入以上細(xì)節(jié),向你完整地展現(xiàn)Java中違例的全貌,使得你能夠在以后的程序編寫中得心應(yīng)手地處理各種可能遭遇的情況。什么是違例控制簡單地說,違例控制就是在程序中提供給你這樣一種能力:1)監(jiān)視程序中的異常情況2)當(dāng)異常情況發(fā)生時(shí),將控制權(quán)交給你自己編寫的違例控制代碼違例控制的流程在Java中,這些工作由以下關(guān)鍵字來完成:try,catch,throw,throws,finally,他們的基本代碼結(jié)構(gòu)如下:try{ //代碼塊}catch(ExceptionType e){ //此違例類型的控制代碼}finally{ //清除回收等工作}首先執(zhí)行try中包含的代碼塊,如果遇到執(zhí)行錯(cuò)誤,程序擲出(throw)一特定類型的違例,你捕捉到此違例并轉(zhuǎn)而執(zhí)行catch中的違例控制代碼。最后,無論程序是否產(chǎn)生違例都必須執(zhí)行finally中的代碼,其主要為一些變量清除、資源回收(1)等工作。違例的類層次結(jié)構(gòu) 違例的類層次結(jié)構(gòu) 首先讓我們來看看Throwable類,Sun是這樣來描述它的:The Throwable class is the superclass of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement. Similarly, only this class or one of its subclasses can be the argument type in a catch clause. Instances of two subclasses,Error and Exception,are conventionally used to indicate that exceptional situations have occurred. Typically, these instances are freshly created in the context of the exceptional situation so as to include relevant information (such as stack trace data). 從中我們可以看出:1)在Java中,違例對象必然是從Throwable中衍生出來的一個(gè)類的實(shí)例。2) Throwable包含兩個(gè)直接子類Error(錯(cuò)誤)和Exception(違例)。3)我們可以創(chuàng)建自己的違例類,只要它是從Throwable或其子類中衍生出來即可(確切地講應(yīng)該是從Exception或其子類中衍生出來,本文不準(zhǔn)備詳細(xì)討論如何創(chuàng)建自己的違例類,你可以參考相關(guān)的資料)。Error類和Exception類Error表示那些由于異常情況引起的嚴(yán)重錯(cuò)誤,我們不應(yīng)去捕獲這類對象,它主要包括系統(tǒng)內(nèi)部錯(cuò)誤以及資源耗盡等情況。而Exception類表示那些你必須去捕捉并處理的情況。檢查違例(Checked Exceptions)和不檢查違例(Unchecked Exceptions)在Exception的子類中有一個(gè)非常重要的類:RuntimeException(2)。Java中將自它或者它的子類衍生出來的任何違例都稱作“不檢查違例(Unchecked Exceptions),自其他Exception子類衍生出來的違例都稱作“檢查違例(Checked Exceptions)(3)。不檢查違例包括的問題主要有:造型錯(cuò)誤,數(shù)組越界存取,空指針訪問等,這些問題一般來說都是你程序編寫的問題。簡單地說,不檢查違例就是那些由編譯器來檢查而無需你程序中控制的違例。而檢查違例是指那些你必須處理的違例,否則編譯時(shí)會產(chǎn)生一個(gè)編譯錯(cuò)誤。你可以選擇下面任意一種方法來處理它:1)捕獲違例:在try代碼塊后面緊跟catch處理代碼塊2)聲明違例:在方法簽名中用throws來通告可能會產(chǎn)生違例Throwable類的構(gòu)造器和方法上面我們已經(jīng)提到throwable是所有違例的超類,在這里我們就來分析一下它。Throwable類有四個(gè)構(gòu)造器方法: Throwable() Throwable(String message) Throwable(String message,Throwable cause) Throwable(Throwable cause) 后兩個(gè)是在JDK1.4中新出現(xiàn)的方法,用來支持所謂的鏈?zhǔn)竭`例(chained exception)機(jī)制(4)。接著,我們來看看throwable的一些主要方法: fillInStackTrace() getStackTrace() printStackTrace() setStackTrace(StackTraceElement[] stackTrace) 這四個(gè)方法是用來處理StackTrace的,如果你對StackTrace不是很熟悉,你可以這樣理解它:就是當(dāng)程序由于運(yùn)行時(shí)錯(cuò)誤終止時(shí)你在屏幕上看到的那些東西。 getLocalizedMessage() getMessage() 這兩個(gè)方法提供了訪問封裝在違例對象里的消息的接口。 toString() Throwable重載了Object類的toString方法,用來返回一個(gè)Throwable的簡短描述。 所有的違例對象都繼承了throwable類的以上方法,所以你可以在catch代碼塊中調(diào)用其中任意一個(gè)方法,比如你可以使用getMessage方法來顯示違例的詳細(xì)信息。 那到底違例是什么意思呢? 在此我們引用Campione,Walrath在《The Java Tutorial》(5)中的原話:The term exception is shorthand for the phrase 'exceptional event'. It can be defined as follows: Definition: An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.'每當(dāng)一個(gè)方法中有異常情況發(fā)生,它就實(shí)例化一個(gè)違例對象并把控制權(quán)交給運(yùn)行時(shí)系統(tǒng)來處理,這些工作都是由throw來完成的(也就是我們通常所說的擲出一個(gè)違例)。而且該違例對象一般保存有自己的類型以及違例發(fā)生時(shí)程序狀態(tài)等信息。處理違例由上可以看出,是由運(yùn)行時(shí)系統(tǒng)來負(fù)責(zé)找出處理違例的代碼。每當(dāng)違例發(fā)生后,運(yùn)行時(shí)系統(tǒng)就開始向后搜索合適的違例控制器(catch代碼塊),比較的標(biāo)準(zhǔn)是:違例控制器中的違例類型必須是產(chǎn)生的違例類型或其超類。如果直到程序的結(jié)尾也沒有找到合適的控制器,程序自動(dòng)終止。違例控制的優(yōu)點(diǎn)相對于傳統(tǒng)的錯(cuò)誤處理機(jī)制,違例控制具有以下優(yōu)點(diǎn):1)將錯(cuò)誤處理代碼和常規(guī)代碼分開2)將錯(cuò)誤交給調(diào)用棧處理,這就是所謂“將事情交給最合適的人來完成的思想3)通過將違例進(jìn)行分類,可以讓我們很容易地看出錯(cuò)誤的所在和原因違例控制的更多細(xì)節(jié)我們在前面說過,除了由Error類和RuntimeException類衍生出來的違例外,你必須在程序中控制(handle)或者聲明(declare)所有可能被擲出的違例,也就是所有的檢查違例都必須得到處理,否則編譯器就會對你亮起紅燈,拒絕編譯。捕獲違例選擇捕獲違例意味著你的程序中必須存在有catch程序塊,而且參數(shù)ExceptionType的類型必須是被擲出違例的類型,或者是其某一繼承鏈中的超類(supperclass)(6)。聲明違例如果在方法中會產(chǎn)生檢查違例,但你又未在此方法中提供此違例的違例控制,那么你就必須聲明此方法可能會擲出某特定違例,利用關(guān)鍵字throws就可以達(dá)到此目的。語法結(jié)構(gòu)為(只列出方法的簽名signature部分):methodName(paramType param) throws ExceptionType到底方法中會擲出哪些違例呢?它包括你的方法中本身代碼擲出的違例,你調(diào)用的方法擲出的違例,甚至還包括你調(diào)用的方法中調(diào)用的其他方法擲出的違例,等等。總之,只要控制流還在你的方法范圍內(nèi),所有擲出的違例都是你必須考慮的。實(shí)例代碼/** *
Title:Except1.java
*Description: Tested using JDK1.4.0 under Win2000 Professional
* @author Mac * @version 2002/9/9 */import java.lang.Thread;class Except1{public static void main(String[] args){ Except1 obj = new Except1(); try { //begin try block obj.myMethod();}catch(InterruptedException e){ System.err.println(“Handle exception here);} //end catch block} //end main void myMethod() throws InterruptedException{ Thread.currentThread().sleep(1000);} //end myMethod} //end class Except1在上面這個(gè)例子中,我們看到myMethod方法只是簡單地聲明自己會產(chǎn)生一個(gè)名為InterruptedException的違例(throws InterruptedException),而真正的處理違例部分延遲到了main方法(catch(InterruptedException e))中。運(yùn)行這個(gè)例子,并回答以下問題,看你是否確實(shí)掌握了它。1、 如果去掉所有的違例控制代碼,會發(fā)生什么情況?按照提示一步步完善你的程序。2、 方法myMethod中的違例是怎么引起的?main方法中呢?3、 把catch(InterruptedException e)換成catch(Exception e)行不行?為什么?捕獲多個(gè)違例 此外,可在try代碼塊中捕獲多個(gè)違例類型,并分別對每種類型加以控制,每種類型對應(yīng)于一個(gè)獨(dú)立的catch從句: try { //codes that might throw exceptions}catch(ExceptionType1 e1){ //actions do with e1}catch(ExceptionType2 e2){ //actions do with e2}catch(ExceptionType3 e3){ //actions do with e3}// …聲明多個(gè)違例能夠捕獲多個(gè)違例,當(dāng)然也就可以聲明多個(gè)違例。比如在myMethod方法中就可以同時(shí)聲明四個(gè)違例: void myMethod() throws InterruptedException,MyException,HerException,OurException { //method code}finally從句前面我們已經(jīng)講過,finally從句中的內(nèi)容一定會被執(zhí)行,無論是否有違例發(fā)生。我們可以利用這個(gè)特性,在finally從句中放置一些執(zhí)行回收資源,內(nèi)存釋放等功能的代碼。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd Java違例控制 總結(jié)Java違例控制 本文主要討論Java中的違例控制,包括以下內(nèi)容:1)什么是違例控制2)違例的概念3) 標(biāo)簽:
Java
相關(guān)文章:
1. axios和ajax的區(qū)別點(diǎn)總結(jié)2. 關(guān)于PHP操作文件的一些FAQ總結(jié)3. 解決python圖像處理圖像賦值后變?yōu)榘咨膯栴}4. PHP擴(kuò)展之文本處理(一)——字符串及字符串函數(shù)大全5. python基礎(chǔ)之Numpy庫中array用法總結(jié)6. Ajax請求超時(shí)與網(wǎng)絡(luò)異常處理圖文詳解7. PHP如何開啟Opcache功能提升程序處理效率8. python中str內(nèi)置函數(shù)用法總結(jié)9. Django REST 異常處理詳解10. HTML基礎(chǔ)知識總結(jié)
排行榜
