文章詳情頁
Java違例控制總結(jié)
瀏覽:80日期:2024-06-14 13:53:05
內(nèi)容: Java違例控制 總結(jié)Java違例控制 本文主要討論Java中的違例控制,包括以下內(nèi)容:1)什么是違例控制2)違例的概念3)Java中違例的類層次結(jié)構(gòu)4)如何擲出和捕獲違例5)捕獲以后如何處理違例本文將通過深入以上細節(jié),向你完整地展現(xiàn)Java中違例的全貌,使得你能夠在以后的程序編寫中得心應(yīng)手地處理各種可能遭遇的情況。什么是違例控制簡單地說,違例控制就是在程序中提供給你這樣一種能力:1)監(jiān)視程序中的異常情況2)當異常情況發(fā)生時,將控制權(quán)交給你自己編寫的違例控制代碼違例控制的流程在Java中,這些工作由以下關(guān)鍵字來完成:try,catch,throw,throws,finally,他們的基本代碼結(jié)構(gòu)如下:try{ //代碼塊}catch(ExceptionType e){ //此違例類型的控制代碼}finally{ //清除回收等工作}首先執(zhí)行try中包含的代碼塊,如果遇到執(zhí)行錯誤,程序擲出(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中衍生出來的一個類的實例。2) Throwable包含兩個直接子類Error(錯誤)和Exception(違例)。3)我們可以創(chuàng)建自己的違例類,只要它是從Throwable或其子類中衍生出來即可(確切地講應(yīng)該是從Exception或其子類中衍生出來,本文不準備詳細討論如何創(chuàng)建自己的違例類,你可以參考相關(guān)的資料)。Error類和Exception類Error表示那些由于異常情況引起的嚴重錯誤,我們不應(yīng)去捕獲這類對象,它主要包括系統(tǒng)內(nèi)部錯誤以及資源耗盡等情況。而Exception類表示那些你必須去捕捉并處理的情況。檢查違例(Checked Exceptions)和不檢查違例(Unchecked Exceptions)在Exception的子類中有一個非常重要的類:RuntimeException(2)。Java中將自它或者它的子類衍生出來的任何違例都稱作“不檢查違例(Unchecked Exceptions),自其他Exception子類衍生出來的違例都稱作“檢查違例(Checked Exceptions)(3)。不檢查違例包括的問題主要有:造型錯誤,數(shù)組越界存取,空指針訪問等,這些問題一般來說都是你程序編寫的問題。簡單地說,不檢查違例就是那些由編譯器來檢查而無需你程序中控制的違例。而檢查違例是指那些你必須處理的違例,否則編譯時會產(chǎn)生一個編譯錯誤。你可以選擇下面任意一種方法來處理它:1)捕獲違例:在try代碼塊后面緊跟catch處理代碼塊2)聲明違例:在方法簽名中用throws來通告可能會產(chǎn)生違例Throwable類的構(gòu)造器和方法上面我們已經(jīng)提到throwable是所有違例的超類,在這里我們就來分析一下它。Throwable類有四個構(gòu)造器方法: Throwable() Throwable(String message) Throwable(String message,Throwable cause) Throwable(Throwable cause) 后兩個是在JDK1.4中新出現(xiàn)的方法,用來支持所謂的鏈式違例(chained exception)機制(4)。接著,我們來看看throwable的一些主要方法: fillInStackTrace() getStackTrace() printStackTrace() setStackTrace(StackTraceElement[] stackTrace) 這四個方法是用來處理StackTrace的,如果你對StackTrace不是很熟悉,你可以這樣理解它:就是當程序由于運行時錯誤終止時你在屏幕上看到的那些東西。 getLocalizedMessage() getMessage() 這兩個方法提供了訪問封裝在違例對象里的消息的接口。 toString() Throwable重載了Object類的toString方法,用來返回一個Throwable的簡短描述。 所有的違例對象都繼承了throwable類的以上方法,所以你可以在catch代碼塊中調(diào)用其中任意一個方法,比如你可以使用getMessage方法來顯示違例的詳細信息。 那到底違例是什么意思呢? 在此我們引用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.'每當一個方法中有異常情況發(fā)生,它就實例化一個違例對象并把控制權(quán)交給運行時系統(tǒng)來處理,這些工作都是由throw來完成的(也就是我們通常所說的擲出一個違例)。而且該違例對象一般保存有自己的類型以及違例發(fā)生時程序狀態(tài)等信息。處理違例由上可以看出,是由運行時系統(tǒng)來負責找出處理違例的代碼。每當違例發(fā)生后,運行時系統(tǒng)就開始向后搜索合適的違例控制器(catch代碼塊),比較的標準是:違例控制器中的違例類型必須是產(chǎn)生的違例類型或其超類。如果直到程序的結(jié)尾也沒有找到合適的控制器,程序自動終止。違例控制的優(yōu)點相對于傳統(tǒng)的錯誤處理機制,違例控制具有以下優(yōu)點:1)將錯誤處理代碼和常規(guī)代碼分開2)將錯誤交給調(diào)用棧處理,這就是所謂“將事情交給最合適的人來完成的思想3)通過將違例進行分類,可以讓我們很容易地看出錯誤的所在和原因違例控制的更多細節(jié)我們在前面說過,除了由Error類和RuntimeException類衍生出來的違例外,你必須在程序中控制(handle)或者聲明(declare)所有可能被擲出的違例,也就是所有的檢查違例都必須得到處理,否則編譯器就會對你亮起紅燈,拒絕編譯。捕獲違例選擇捕獲違例意味著你的程序中必須存在有catch程序塊,而且參數(shù)ExceptionType的類型必須是被擲出違例的類型,或者是其某一繼承鏈中的超類(supperclass)(6)。聲明違例如果在方法中會產(chǎn)生檢查違例,但你又未在此方法中提供此違例的違例控制,那么你就必須聲明此方法可能會擲出某特定違例,利用關(guān)鍵字throws就可以達到此目的。語法結(jié)構(gòu)為(只列出方法的簽名signature部分):methodName(paramType param) throws ExceptionType到底方法中會擲出哪些違例呢?它包括你的方法中本身代碼擲出的違例,你調(diào)用的方法擲出的違例,甚至還包括你調(diào)用的方法中調(diào)用的其他方法擲出的違例,等等。總之,只要控制流還在你的方法范圍內(nèi),所有擲出的違例都是你必須考慮的。實例代碼/** *
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在上面這個例子中,我們看到myMethod方法只是簡單地聲明自己會產(chǎn)生一個名為InterruptedException的違例(throws InterruptedException),而真正的處理違例部分延遲到了main方法(catch(InterruptedException e))中。運行這個例子,并回答以下問題,看你是否確實掌握了它。1、 如果去掉所有的違例控制代碼,會發(fā)生什么情況?按照提示一步步完善你的程序。2、 方法myMethod中的違例是怎么引起的?main方法中呢?3、 把catch(InterruptedException e)換成catch(Exception e)行不行?為什么?捕獲多個違例 此外,可在try代碼塊中捕獲多個違例類型,并分別對每種類型加以控制,每種類型對應(yīng)于一個獨立的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}// …聲明多個違例能夠捕獲多個違例,當然也就可以聲明多個違例。比如在myMethod方法中就可以同時聲明四個違例: void myMethod() throws InterruptedException,MyException,HerException,OurException { //method code}finally從句前面我們已經(jīng)講過,finally從句中的內(nèi)容一定會被執(zhí)行,無論是否有違例發(fā)生。我們可以利用這個特性,在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) 標簽:
Java
相關(guān)文章:
1. Android CountDownTimer案例總結(jié)2. Ajax對緩存的處理方法實例分析3. PHP擴展之文本處理(二)——PCRE正則表達式語法2——元字符4. python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進行簡單處理和分析5. ajax和fetch的區(qū)別點總結(jié)6. Python3和hmac。如何處理不是二進制的字符串7. PHP擴展之文本處理(二)——PCRE正則表達式語法1——分隔符8. Android如何優(yōu)雅的處理重復點擊9. Java 跨域問題的處理方式10. python中HTMLParser模塊知識點總結(jié)
排行榜
