Java程序設(shè)計@第06章-異常與斷言綜述綜述_第1頁
Java程序設(shè)計@第06章-異常與斷言綜述綜述_第2頁
Java程序設(shè)計@第06章-異常與斷言綜述綜述_第3頁
Java程序設(shè)計@第06章-異常與斷言綜述綜述_第4頁
Java程序設(shè)計@第06章-異常與斷言綜述綜述_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java程序設(shè)計第06章異常與斷言本章內(nèi)容CORE-C06-01捕捉異常

CORE-C06-02處理異常

CORE-C06-03斷言

CORE-C06-04日志記錄

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

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

√√2、JDK異常類型設(shè)計

√√3、異常對象

√√4、捕捉多個異常

√√5、finally子句

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

try{

語句;

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

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

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

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

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

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

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

√√4、異常類設(shè)計

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

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

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

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

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

√√2、啟用斷言

√√3、禁用斷言

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

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

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

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

√√3、日志管理器配置

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

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

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

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論