Java程序設(shè)計(jì)@第06章-異常與斷言綜述綜述_第1頁(yè)
Java程序設(shè)計(jì)@第06章-異常與斷言綜述綜述_第2頁(yè)
Java程序設(shè)計(jì)@第06章-異常與斷言綜述綜述_第3頁(yè)
Java程序設(shè)計(jì)@第06章-異常與斷言綜述綜述_第4頁(yè)
Java程序設(shè)計(jì)@第06章-異常與斷言綜述綜述_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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程序設(shè)計(jì)第06章異常與斷言本章內(nèi)容CORE-C06-01捕捉異常

CORE-C06-02處理異常

CORE-C06-03斷言

CORE-C06-04日志記錄

本章目標(biāo)1、能處理異常。2、能使用斷言調(diào)試程序。第01節(jié)捕捉異常

知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用1CORE-C06-01捕捉異常1、異常捕捉語(yǔ)法

√√2、JDK異常類(lèi)型設(shè)計(jì)

√√3、異常對(duì)象

√√4、捕捉多個(gè)異常

√√5、finally子句

√√1、異常捕捉語(yǔ)法-1異常捕捉是屬于流程控制的語(yǔ)法范疇,只是流程改變的條件是程序捕捉到系統(tǒng)或者程序拋出的異常。異常不是錯(cuò)誤:程序中的異常,一般稱(chēng)為例外情況,可以理解為是非正常情況,這里需要分清楚的是異常和錯(cuò)誤不是一個(gè)概念。異常并非是真正的錯(cuò)誤,因?yàn)樗麄兪且恍├馇闆r,這些情況有可能不會(huì)導(dǎo)致系統(tǒng)直接崩潰掉,但是它的存在只能說(shuō)是程序的某種缺陷,或者說(shuō)是非必然缺陷,而Java里面提供的異常體系結(jié)構(gòu)就是為了解決這些缺陷而存在的。1、異常捕捉語(yǔ)法-2語(yǔ)法塊try中發(fā)生異常,系統(tǒng)把執(zhí)行跳轉(zhuǎn)到匹配catch后異常類(lèi)型的catch塊中。

try{

語(yǔ)句;

}catch(Throwablee){//catch與finally至少出現(xiàn)一個(gè),也可以同時(shí)出現(xiàn)。

語(yǔ)句;}catch(Throwablee){//catch可以出現(xiàn)多次,但同樣類(lèi)型的異常只能catch一次

語(yǔ)句; //拋出的異常與catch指定的異常類(lèi)型符合,就執(zhí)行。} //如果多個(gè)catch捕捉的異常是父子關(guān)系,則父異常排后。finally{ //finally最多只能出現(xiàn)一次。

語(yǔ)句; //finally任何時(shí)候都執(zhí)行。} 2、JDK異常類(lèi)型設(shè)計(jì)Throwable是所有異常的基類(lèi),程序中一般不會(huì)直接拋出Throwable對(duì)象,Throwable本身存在兩個(gè)子類(lèi)實(shí)例,一個(gè)是Error、一個(gè)是Exception;3、異常對(duì)象異常對(duì)象一般是系統(tǒng)拋出的,當(dāng)程序捕捉到異常后跳轉(zhuǎn)到catch塊,通過(guò)catch的參數(shù)傳遞給用戶(hù),用戶(hù)可以直接使用。通過(guò)異常對(duì)象通常可以得到兩個(gè)有用的操作:獲得異常信息。打印異常棧。publicStringgetMessage();publicvoidprintStackTrace()4、捕捉多個(gè)異常在try{}catch(Throwablee){}finally{}結(jié)構(gòu)中,允許有多個(gè)catch。即意味著try可以同時(shí)捕捉多個(gè)異常并處理多個(gè)異常。但每個(gè)異常只有一個(gè)catch塊得到執(zhí)行,該catch塊的參數(shù)類(lèi)型必須與捕捉到的異常對(duì)象是同一類(lèi)型。這里的同一類(lèi)型可以是同一繼承結(jié)構(gòu)上的類(lèi)。拋出的異常對(duì)象沒(méi)有catch匹配,則程序的執(zhí)行流程會(huì)跳轉(zhuǎn)到虛擬機(jī)執(zhí)行。捕捉多個(gè)異常必須遵循如下語(yǔ)法規(guī)則:不能2次捕捉、處理完全相同名字的異常類(lèi)。5、finally子句-1在try{}catch(Throwablee){}finally{}結(jié)構(gòu)中catch塊與finally必須至少出現(xiàn)一個(gè),當(dāng)然也可以同時(shí)出現(xiàn)。塊finally與catch塊的最大區(qū)別,catch是參數(shù)類(lèi)型與捕捉到的異常對(duì)象匹配才能執(zhí)行。而finally是任何條件下都會(huì)得到執(zhí)行。一般finally用來(lái)處理的文件IO操作時(shí)的異常處理。不論文件操作成功還是失敗,文件都是需要關(guān)閉的。try{//不處理異常也會(huì)執(zhí)行finally}finally{}try{ 處理異常后執(zhí)行finally}catch(Exceptione){}finally{}第02節(jié)處理異常

知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用2CORE-C06-02處理異常1、拋出異常

√√2、異常轉(zhuǎn)移

√√3、創(chuàng)建異常類(lèi)

√√4、異常類(lèi)設(shè)計(jì)

√√1、拋出異常-1上節(jié)處理的異常是從哪里來(lái)的呢?通常包含兩種情況,虛擬機(jī)拋出的是Error,應(yīng)用程序拋出的是Exception。應(yīng)用程序的Exception是使用throw關(guān)鍵字拋出的。語(yǔ)法:語(yǔ)句throw拋出異常對(duì)象,并中斷程序的執(zhí)行。語(yǔ)句throw在函數(shù)中調(diào)用來(lái)拋出異常,在調(diào)用函數(shù)的代碼中可以使用try捕捉到,并使用catch處理。沒(méi)有捕捉的異常會(huì)被虛擬機(jī)缺省處理(打印異常棧,終止程序)。Exceptione=newException(“異常原因描述字符串”);throwe;throw異常對(duì)象;//只能拋出一個(gè)異常對(duì)象。1、拋出異常-2強(qiáng)制異常與處理拋出異常的函數(shù),在調(diào)用的時(shí)候是可以捕捉、也可以不捕捉異常的。為了強(qiáng)制用戶(hù),Java引入一種語(yǔ)法機(jī)制,在函數(shù)后面可以使用異常列表。異常列表表示在調(diào)用該函數(shù)的時(shí)候,異常列表中的異常必須全部處理,或者轉(zhuǎn)移。異常列表語(yǔ)法publicclassThrowException{publicvoidmethod()throwsMyException,YourException{

}}throws異常類(lèi)1,異常類(lèi)2,…… // 必須在方法后。1、拋出異常-3覆蓋方法聲明拋出的異常,必須在原方法聲明拋出的異常范圍內(nèi),不能聲明拋出原方法沒(méi)有聲明拋出的異常。也就是說(shuō),如果有原方法中沒(méi)有聲明的異常拋出,則只能在該覆蓋方法中使用try…catch進(jìn)行捕獲和處理,而不能使用throws聲明拋出該異常。publicclassClsA{publicvoidmethod()throwsMyException,YourException{}}publicclassClsBextendsClsA{//publicvoidmethod()throwsIOException{//錯(cuò)誤//publicvoidmethod()throwsMyException{ //合法

//publicvoidmethod()throwsException{ //錯(cuò)誤publicvoidmethod(){ //合法

}}2、異常轉(zhuǎn)移一般調(diào)用有異常列表的函數(shù)或者方法,要么處理,要么轉(zhuǎn)移。所謂轉(zhuǎn)移就是不處理函數(shù)或者方法的異常,而是轉(zhuǎn)移給另外調(diào)用者處理,如果一直轉(zhuǎn)移都沒(méi)有處理,最終會(huì)轉(zhuǎn)移給虛擬機(jī)做缺省處理。異常轉(zhuǎn)移的語(yǔ)法非常簡(jiǎn)單,就是在調(diào)用函數(shù)的代碼所在函數(shù)后面添加異常列表。publicclassThrowException1{staticpublicvoidmeth1()throwsMyException,YourException{……}}publicclassThrowException2{staticpublicvoidmeth2()throwsMyException,YourException{ ThrowException1.meth1();//不處理異常,而是通過(guò)異常列表轉(zhuǎn)移。}}3、創(chuàng)建異常類(lèi)創(chuàng)建異常類(lèi)一般遵循如下規(guī)則:繼承一個(gè)Exception類(lèi)或者Exception的子類(lèi)。在帶參構(gòu)造器中調(diào)用父類(lèi)中帶字符串參數(shù)構(gòu)造器。并傳遞異常描述。至少創(chuàng)建一個(gè)缺省構(gòu)造器與帶字符串參數(shù)的帶參構(gòu)造器。在帶參構(gòu)造器中調(diào)用父類(lèi)中帶字符串參數(shù)構(gòu)造器。并傳遞字符串異常描述。publicclassMyExceptionextendsException{ publicMyException(){super(“我的異常”);} publicMyException(Stringmsg){super(msg);}}4、異常類(lèi)設(shè)計(jì)Java的異常結(jié)構(gòu)體系中采用異常類(lèi),每個(gè)異常類(lèi)本身表明了異常發(fā)生的原因與條件。這樣對(duì)異常處理的時(shí)候直接、方便。所以一般建議程序員在應(yīng)用程序中采用獨(dú)立的異常類(lèi)結(jié)構(gòu)來(lái)處理應(yīng)用程序的異常。這個(gè)異常類(lèi)采用獨(dú)立的繼承擴(kuò)展設(shè)計(jì)結(jié)構(gòu)。每個(gè)模塊有一個(gè)異常根類(lèi),其他異常都從該類(lèi)擴(kuò)展得到,并根據(jù)業(yè)務(wù)模塊產(chǎn)生復(fù)雜的異常結(jié)構(gòu),該結(jié)構(gòu)與系統(tǒng)框架結(jié)構(gòu)應(yīng)該是一致的。一般建議異常類(lèi)最好繼承Exception或者RuntimeException。第03節(jié)斷言

知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用3CORE-C06-03斷言1、斷言的語(yǔ)法

√√2、啟用斷言

√√3、禁用斷言

√√4、使用斷言的建議√√√1、斷言的語(yǔ)法斷言:是JDK1.4引入的代碼調(diào)試機(jī)制。是一種錯(cuò)誤拋出機(jī)制,在程序開(kāi)發(fā)階段用來(lái)調(diào)試代碼,但編譯成正式發(fā)布版本時(shí)可以屏蔽的語(yǔ)句。斷言拋出的錯(cuò)誤是AssertError類(lèi)型。語(yǔ)句assert拋出的異常也是可以使用try處理的。語(yǔ)法:條件可以是任何邏輯表達(dá)式,當(dāng)條件為false的時(shí)候,拋出AssertionError錯(cuò)誤。assert條件; //第一種形式assert條件:表達(dá)式; //第二種形式,表達(dá)式可以是任意類(lèi)型。2、啟用斷言默認(rèn)情況下,JVM不啟動(dòng)斷言,啟動(dòng)斷言只需要在java或者javaw命令后使用選項(xiàng)-ea[:<packagename>...|:<classname>]-enableassertions[:<packagename>...|:<classname>]其中斷言開(kāi)啟的粒度可以指定包路徑,或者某些類(lèi)。斷言分成兩種:由類(lèi)加載器加載的類(lèi)中斷言使用-ea可以開(kāi)啟。由JVM直接加載的類(lèi)中斷言使用-esa|-enablesystemassertions可以開(kāi)啟。通常只需要-ea就足夠。

3、禁用斷言在java命令中使用選項(xiàng)關(guān)閉斷言,默認(rèn)斷言是關(guān)閉的。-da[:<packagename>...|:<classname>]-disableassertions[:<packagename>...|:<classname>]關(guān)閉系統(tǒng)斷言-dsa|-disablesystemassertions4、使用斷言的建議前提:斷言失敗是致命的、不可恢復(fù)的錯(cuò)誤。斷言檢查僅僅用在程序開(kāi)發(fā)和測(cè)試階段。結(jié)果斷言?xún)H僅應(yīng)該在測(cè)試階段用來(lái)定位程序內(nèi)部錯(cuò)誤??梢詫嘌哉Z(yǔ)句作為方法的前置條件或后置條件來(lái)添加,也可以將其置于任何方法內(nèi),或放在if…else塊和switch塊中。assert關(guān)鍵字的唯一限制在于它必須位于可執(zhí)行塊中。對(duì)一個(gè)方法調(diào)用是否使用斷言,應(yīng)先看看該方法的文檔。如果文檔指明在某種情況下會(huì)拋出異常,那么對(duì)這種情況不需使用斷言;如果文檔指明一個(gè)限制條件,但沒(méi)有說(shuō)明違反該條件會(huì)拋出異常,此時(shí)就可以使用斷言斷言不應(yīng)該以任何方式改變程序的狀態(tài)斷言可以用于驗(yàn)證傳遞給private方法的參數(shù)。不過(guò),斷言不應(yīng)該用于驗(yàn)證傳遞給public方法的參數(shù),因?yàn)椴还苁欠駟⒂昧藬嘌?,public方法都必須檢查其參數(shù)。不過(guò)可以在public方法中或者非public方法中利用斷言測(cè)試后置條件。第04節(jié)日志記錄

知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用4CORE-C06-04日志記錄1、全局日志記錄

√√2、自定制日志記錄器

√√3、日志管理器配置

√√1、全局日志記錄-1日志系統(tǒng)是一種不可或缺的跟蹤調(diào)試工具:特別是在任何無(wú)人職守的后臺(tái)程序以及那些沒(méi)有跟蹤調(diào)試環(huán)境的系統(tǒng)中有著廣泛的應(yīng)用。長(zhǎng)期以來(lái),日志系統(tǒng)作為一種應(yīng)用程序服務(wù),對(duì)于跟蹤調(diào)試、程序狀態(tài)記錄、崩潰數(shù)據(jù)恢復(fù)都有非?,F(xiàn)實(shí)的意義。常見(jiàn)日志系統(tǒng):Log4j:最早的Java日志記錄框架之一,Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,通過(guò)使用Log4j,可以控制日志信息輸出的目的地是控制臺(tái)、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器等,也可以控制每一條日志輸出的格式。JDK1.4LoggingFramework繼Log4j之后,JDK標(biāo)準(zhǔn)委員會(huì)將Log4j的基本思想吸收到了JDK當(dāng)中,在JDK1.4中發(fā)布了第一個(gè)日志框架接口,并且提供了很簡(jiǎn)單的實(shí)現(xiàn)。CommonsLoggingFramework該框架同樣是Apache基金會(huì)的項(xiàng)目,其出現(xiàn)的目的是為了整合Java項(xiàng)目中的JDK1.4LoggingFramework框架以及Log4j,使得應(yīng)用程序可以在這兩種框架上進(jìn)行隨意切換,因此該框架提供了比較統(tǒng)一的調(diào)用接口和配置方法。1、全局日志記錄-2Logger是日志系統(tǒng)的主體對(duì)象。Handler對(duì)象從Logger中獲取日志信息,并且將這些信息導(dǎo)出,它可以將這些信息寫(xiě)入控制臺(tái)或者文件,也可以將這些信息發(fā)送到網(wǎng)絡(luò)日志服務(wù)器上,或者轉(zhuǎn)發(fā)到其他操作系統(tǒng)日志中。如果要禁用Handler,就直接使用setLevel(Level.OFF)來(lái)操作,并且可以根據(jù)適當(dāng)?shù)募?jí)別來(lái)重新啟用。Filter是一個(gè)接口,對(duì)日志記錄進(jìn)行過(guò)濾Formatter為格式化LogRecords提供支持。1、全局日志記錄-3JDK中日志主要類(lèi)是Logger。創(chuàng)建Logger對(duì)象:(單子模式)輸出日志信息staticLoggergetLogger(Stringname)staticLoggergetLogger(Stringname,StringresourceBundleName)voidlog(Levellevel,Stringmsg)voidlog(Levellevel,Stringmsg,Objectparam1)voidlog(Levellevel,Stringmsg,Object[]params)voidlog(Levellevel,Stringmsg,Throwablethrown)voidlog(LogRecordrecord)1、全局日志記錄-4Level的日志級(jí)別:SEVERE(highestvalue)WARNINGINFOCONFIGFINEFINERFINEST(lowestvalue)LogRecord日志記錄LogRecord(Levellevel,Stringmsg)1、全局日志記錄-5方法log這種方法帶有日志級(jí)別、消息字符串以及可選的字符串參數(shù);方法logp:帶有顯示的源類(lèi)名稱(chēng)和方法名稱(chēng);方法logrb帶有顯示的本地化日志消息使用的資源包名稱(chēng);跟蹤方法

entering方法、exiting方法、throwing方法;一些便捷方法severe,warning,info

2、自定制日志記錄器定制Filter與Formatter。Filter的接口方法:Formatter的抽象方法:Filter可以在Logger中綁定,也可以在Handler中綁定。Formatter只能與Handler綁定。由于Handler可以相互傳遞形成Handler鏈。booleanisLoggable(LogRecordrecord)abstractStringformat(LogRecordrecord)3、日志管理器配置-1LogManager在整個(gè)日志框架里面,存在一個(gè)單一的全局LogManager對(duì)象,它可以用于維護(hù)Logger和日志服務(wù)的一組共享狀態(tài)。LogManager的作用:管理Logger對(duì)象的層次結(jié)構(gòu)名稱(chēng)空間,所有指定

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論