版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 異常層次需要考察的異常情況有:用戶輸入錯(cuò)誤、設(shè)備錯(cuò)誤、物理限制、程序錯(cuò)誤,傳統(tǒng)的返回錯(cuò)誤碼的方法并不能處理所有的情況。1.1 異常分類在Java程序中,異常對(duì)象都派生于Throwable。如果Java的內(nèi)置異常不滿足需求,則可以創(chuàng)建自定義異常。下圖是基本的異常體系:Error類描述了Java運(yùn)行時(shí)系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡錯(cuò)誤,此類錯(cuò)誤不應(yīng)由應(yīng)用程序拋出。而Exception分兩類,一類是因程序邏輯問題,導(dǎo)致系統(tǒng)出問題,此時(shí)就是Runtime異常,如數(shù)組越界、類型轉(zhuǎn)換錯(cuò)誤、訪問空指針。而如果程序可以正常,但在遇到不同IO情況時(shí),出問題導(dǎo)致,則屬于IO異常,如打開格式錯(cuò)誤的URL、在文件尾部讀
2、數(shù)據(jù)、加載不存在的類文件等。RuntimeException一定是程序?qū)懙挠袉栴},是可以避免出現(xiàn)的。Java將Error和RuntimeException定義為未檢查的異常。其他異常為已檢查。編譯器將檢查代碼是否為所有已檢查異常提供異常處理器。1.2 異常聲明方法應(yīng)該在首部聲明其所有可能拋出的異常,例如:public void lookup() throws XXException,YYException一個(gè)方法必須聲明所有可能拋出的已檢查異常,而未檢查異常要么不可控,要么就應(yīng)該避免發(fā)生。如果方法沒有聲明所有可能發(fā)生的已檢查異常,編譯器就會(huì)給出錯(cuò)誤消息。當(dāng)程序調(diào)用一個(gè)拋出已檢查異常的方法、或程
3、序自己會(huì)拋出異常時(shí),有必要進(jìn)行異常聲明,對(duì)于Error和Runtime這些未檢查異常,無人可以預(yù)料,因此不需要聲明。1.3 自定義異常如果遇到標(biāo)準(zhǔn)異常不能說明的情況,則需要自定義異常。只需要繼承自某個(gè)異常類,并定義兩個(gè)構(gòu)造函數(shù)即可。一個(gè)默認(rèn)構(gòu)造函數(shù),一個(gè)帶有描述信息的構(gòu)造器。2 捕獲異常異常的捕獲需要周密的計(jì)劃。如果異常沒有被捕獲,程序會(huì)終止,并會(huì)在控制臺(tái)上輸出異常信息。對(duì)UI程序,異常出現(xiàn)后會(huì)提示用戶,用戶可以繼續(xù)返回到程序中。使用try塊來捕獲異常trycatch(XXXException e)catch(YYYException e)如果try語句中的任何代碼拋出一個(gè)在catch中指定的
4、異常,則程序會(huì)跳過try語句中的其余代碼轉(zhuǎn)而執(zhí)行catch子句中的代碼。如果拋出的是不在catch中指定的異常,則程序立即返回到上層調(diào)用者。當(dāng)捕獲到異常后,一種方法是我們自己處理;另一種是不處理,交給調(diào)用者去處理,這樣只需要聲明異常即可。如果應(yīng)該捕獲那些知道如何處理的異常,而將不知道如何處理的異常傳遞給上層。將異常交給足以勝任的處理器,比壓抑它好得多。2.1 捕獲多個(gè)異常通過示例代碼,可以捕獲多個(gè)異常2.2 鏈?zhǔn)疆惓.?dāng)捕獲到異常后,我們可以改變其類型,并重新拋出。這樣做可以隱藏底層異常的細(xì)節(jié),保持異常解釋的抽象性。為了獲得真正的底層異常,可以用setCause()方法將底層異常包裝到高層異常中
5、,并在需要的時(shí)候用getCause()來獲取。2.3 finally子句不論異常是否發(fā)生,finally中的語句都會(huì)被執(zhí)行,這可以作為一種比較合適的清理資源的方式。當(dāng)然如果在finally中拋出異常,則會(huì)導(dǎo)致try中異常類型丟失。因此建議異常的使用風(fēng)格如下:try try finally catch()內(nèi)層的try.finall
6、y負(fù)責(zé)清理資源,而外層的try只負(fù)責(zé)報(bào)告錯(cuò)誤。2.4 堆棧跟蹤java.lang.ThrowableThrowable(String s)Throwable(Throwable cause) Throwable(String s,Throwable cause) 用給定的cause構(gòu)造一個(gè)異常Throwable getCause()void setCause()String getMessage() 獲得描述信息StackTraceElement getStackTrace() 獲取構(gòu)造這個(gè)對(duì)象時(shí)調(diào)用堆棧的跟蹤java.lang.ExceptionExcept
7、ion(Throwable cause) Exception(String s,Throwable cause) 用給定的cause構(gòu)造一個(gè)異常java.lang.RuntimeExceptionRuntimeException(Throwable cause) RuntimeException(String s,Throwable cause) 用給定的cause構(gòu)造一個(gè)異常java.lang.StackTraceElementString getFileName() 返回元素運(yùn)行時(shí)對(duì)應(yīng)的源文件名int getLineNumber()
8、返回元素運(yùn)行時(shí)對(duì)應(yīng)的源文件行數(shù)String getClassName() 返回元素運(yùn)行時(shí)類命名String getMethodName() 返回方法名bool isnativeMethod()2.5 異常機(jī)制使用建議I 異常機(jī)制對(duì)于性能損耗較大,最好使用簡(jiǎn)單測(cè)試來避免異常發(fā)生,如在stack非空時(shí)才調(diào)用pop,比使用try包圍的pop性能高100倍II 不要過分細(xì)分異常,將一段正常的流程放在一個(gè)try塊中而不是分到不同的try塊中,有得于代碼的閱讀。III 善于利用異常層次,不要只拋出RuntimeException,而應(yīng)該尋找和創(chuàng)建更適合的子類;也不要只捕獲Throwable,否則代碼會(huì)較難
9、閱讀。IV 合理壓制異常。如果認(rèn)為異常不是問題則可以合理的壓制,否則則應(yīng)該聲明或拋出。V 早拋出,晚捕獲;在程序出錯(cuò)的地方立即拋出異常,而盡可能向高層傳遞非細(xì)節(jié)異常。3 記錄日志3.1 logging包的類結(jié)構(gòu)3.2 全局日志日志模塊,擁有一個(gè)全局變量Logger.global,可以用它向控制臺(tái)輸出信息。L(String s) 打印日志到標(biāo)準(zhǔn)輸出Logger.global.setLevel(Level level) 設(shè)置日志級(jí)別3.3 命名日志日志也具有層次結(jié)構(gòu),不同的包可以按結(jié)構(gòu)名來獲取各自的日志,把記錄器命名與主程序包一樣的名字是一
10、個(gè)好的實(shí)踐。日志有7個(gè)級(jí)別:SEVERE WARNING INFO CONFIG FINE FINER FINEST,默認(rèn)為INFO級(jí)別。ALL代表所有級(jí)別,OFF表示關(guān)閉。java.util.logging.Logger類static Logger getLogger(String .log) static Logger getLogger(String name,String resName) 提供資源包的日志void setLevel(Level l) 設(shè)置日志記錄器級(jí)別Level getLevel()void addHandler(Handler h)
11、160;添加處理器void removeHandler(handler h)void setUseParantHandlers(bool flag) 設(shè)置是否使用父處理器void log(Level level,String msg) 按指定級(jí)別記錄日志void log(Level level,String format,Object objs) 按指定級(jí)別記錄日志void logp(Level level,String classname,String methodName,String msg)void logp(Level level,String classna
12、me,String methodName,String format,Object objs)void logrb(Level level,String classname,String methodName,String resname,String format,Object objs)void throwing(String classname,String methodName,Thowable t) 記錄異常的信息3.4 日志管理器配置日志系統(tǒng)的配置默認(rèn)位于jre/lib/perties中。如果要使用不同的配置,要在JVM啟動(dòng)時(shí)指定,java -Djava.ut
13、il.logging.config.file = path MainClass在配置文件中可以指定日志處理器、對(duì)日志處理器進(jìn)行相應(yīng)的配置、日志輸出級(jí)別、日志輸出格式等3.5 日志的國(guó)際化在獲取日志時(shí),還可以為日志指定資源包,以支持本地化的日志顯示。3.6 日志處理器默認(rèn)情況下,日志將記錄發(fā)送到ConsoleHandler中,并由它輸出到System.err流中。日志處理器也有級(jí)別,其只處理日志條目級(jí)別高于處理器級(jí)別的條目。如果想繞過配置,則需要自己設(shè)置日志記錄器的級(jí)別和處理器的級(jí)別,并將處理器安裝到日志上。如果希望將日志發(fā)送到其他地方,需要添加其他的處理器。系統(tǒng)提供了兩個(gè)有用的處理器,F(xiàn)ile
14、Handler和Sockethandler。用戶可以自行繼承自Handler或StreamHandler來實(shí)現(xiàn)自定義的日志輸出方式。java.util.logging.handlerabstract void publish(LogRecord lr) 將日志寫到特定流abstract void flush() 刷新已緩沖數(shù)據(jù)Formatter getFormatter()void setFormatter(Formatter f) 設(shè)置格式化器void setLevel(Level l) 設(shè)置處理級(jí)別java.util.logging.ConsoleHandlerjava.uti
15、l.logging.FileHandlerFileHandler(String namePatter,bool append) 以日志命名模式和是否追加初始化日志FileHandler(String namePatter,int limit,int count,int append) limit控制日志內(nèi)最大條數(shù),count控制循環(huán)日志數(shù)3.7 格式化器系統(tǒng)提供的處理器可以生成平坦文本和XML格式的日志記錄,我們也可以自定義格式,只需要擴(kuò)展Formatter類并覆蓋format()方法即可。對(duì)于XML格式化,需要覆蓋getHead/Tail來提供特定的頭和尾內(nèi)容。jav
16、a.util.logging.Formatterabstract String format(LogRecord lr)String getHead/Tail()String formatMessage(LogRecord lr)4 使用斷言assert cond 如果cond為假,則拋出異常assert cond:expr 如果cond為假,則使用expr作字符串構(gòu)造異常在默認(rèn)時(shí),斷言并不生效,通過在控制臺(tái)增加enable進(jìn)行啟用:java -enableassertion myapp或java -ea:class1 -ea:packet1啟用和禁用斷言并不需要重新編譯程序,這是由類加載器來完成的。對(duì)于由虛擬機(jī)加載的類,可以使用esa來進(jìn)行加載。斷言是一種在開發(fā)和測(cè)試中使用的技術(shù),不要將斷言代替異常和日志。5 調(diào)試技術(shù)5.1 常用方法5.1.1 使用print或log方法輸出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年池州石臺(tái)縣消防救援局招聘2名備考題庫(kù)及答案詳解(新)
- 2025蒙晟建設(shè)有限公司招聘緊缺專業(yè)人員8人備考題庫(kù)及1套完整答案詳解
- 2026山東省科創(chuàng)集團(tuán)有限公司權(quán)屬企業(yè)招聘5人備考題庫(kù)及答案詳解(易錯(cuò)題)
- 2026上半年云南普洱市勐馬鎮(zhèn)征兵備考題庫(kù)及參考答案詳解一套
- 2026吉林遼源教育專業(yè)技術(shù)人才校園招聘補(bǔ)充備考題庫(kù)及答案詳解參考
- 2025貴州貴陽市體育中學(xué)招聘2人備考題庫(kù)有完整答案詳解
- 2026河南漯河醫(yī)學(xué)高等??茖W(xué)校人才引進(jìn)5人備考題庫(kù)及一套參考答案詳解
- 2025廣東中山市東區(qū)街道辦事處招聘專職消防員2人備考題庫(kù)及參考答案詳解
- 2025年圖形設(shè)計(jì)基礎(chǔ)理論試題及答案
- 2025湖北武漢市第五醫(yī)院招聘?jìng)淇碱}庫(kù)及答案詳解(新)
- AI在知識(shí)問答中的應(yīng)用
- 智慧檢驗(yàn)與大數(shù)據(jù)分析知到課后答案智慧樹章節(jié)測(cè)試答案2025年春溫州醫(yī)科大學(xué)
- 課題二教書育人課件
- 高貝利特低熱硅酸鹽水泥熟料煅燒及技術(shù)探討
- GB/T 44312-2024巡檢機(jī)器人集中監(jiān)控系統(tǒng)技術(shù)要求
- 美術(shù)教師季度考核總結(jié)
- GB/T 4074.2-2024繞組線試驗(yàn)方法第2部分:尺寸測(cè)量
- 液氨儲(chǔ)罐區(qū)安全評(píng)價(jià)
- 生物必修一-高中生物課件
- 慢性腎臟病課件
- TOC制約法縱覽高德拉特企管公司
評(píng)論
0/150
提交評(píng)論