異常概述
程序在運(yùn)行中總會(huì)面臨一些“意外”情況,良好的代碼需要對(duì)它們進(jìn)行預(yù)防和處理。大致來說,這些意外情況分三類:
交互輸入
用戶以非預(yù)期的方式使用程序,比如非法輸入,不正當(dāng)?shù)牟僮黜樞?,輸入文件錯(cuò)誤等。軟件和硬件環(huán)境問題
文件不存在,文件格式錯(cuò)誤,網(wǎng)絡(luò)問題,存儲(chǔ)空間不足,需要的預(yù)安裝庫不存在,系統(tǒng)版本不匹配等。代碼錯(cuò)誤
使用的其它代碼可能的執(zhí)行錯(cuò)誤,如調(diào)用了有關(guān)數(shù)學(xué)計(jì)算的方法中執(zhí)行了除0操作等。
發(fā)現(xiàn)異常和處理異常都是困難的,需要非常嚴(yán)謹(jǐn)?shù)拇a。實(shí)際上,程序總是分層或分模塊的,往往發(fā)生異常的地方和最終調(diào)用的地方“相距”甚遠(yuǎn)。而且,異常的處理有時(shí)需要通知用戶,甚至需要用戶來決定接下來的動(dòng)作。又或者,程序運(yùn)行在“后臺(tái)”,對(duì)錯(cuò)誤的只能是記錄措施。異常發(fā)生后,有的情況是需要從錯(cuò)誤的狀態(tài)中恢復(fù)再繼續(xù)執(zhí)行,又或者是保存狀態(tài)然后終止執(zhí)行等。
有關(guān)異常的發(fā)現(xiàn)和預(yù)防是一個(gè)具體問題具體對(duì)待的經(jīng)驗(yàn)之談。對(duì)于異常處理框架,關(guān)鍵包括異常的表示、傳遞和捕獲。接下來我們結(jié)合Java提供的異常處理機(jī)制來學(xué)習(xí)下如何在正常的程序邏輯中加入異常處理的代碼。
Java中的異常處理機(jī)制
異常信息是為了通知更上層的方法調(diào)用者有關(guān)意外的情況,所以它有一個(gè)隨方法調(diào)用棧向上傳遞的過程,異常信息會(huì)像返回值那樣被層層上傳,直到有方法處理它。
作為面向?qū)ο笳Z言,Java提供給我們的幾乎都是類、接口這些編程元素。異常處理也不例外,Java并不選擇使用返回值來表示異常信息(因?yàn)橛袝r(shí)返回值無法表達(dá)異常情況,而且會(huì)搞亂正常的返回值含意,想象下返回任意int值的方法。你依然可以對(duì)返回值做很多約定,使用參數(shù)來攜帶異常信息也是受限的),而是定義了Throwable相關(guān)的類層次來表示異常。這樣可以保證正常代碼執(zhí)行的簡(jiǎn)明流程,而“異常發(fā)生”后將產(chǎn)生一個(gè)Throwable對(duì)象并隨著調(diào)用棧向上傳遞,對(duì)應(yīng)方法立即退出,沒有任何返回值,調(diào)用方法的代碼收到異常后繼續(xù)退出并上傳到更上層方法調(diào)用,或者捕獲此異常。
接下來就依次來了解下Java異??蚣芴峁┑漠惓1硎?、傳遞和捕獲處理相關(guān)的實(shí)現(xiàn)細(xì)節(jié)。
異常表示:Throwable繼承層次
Java中的“異?!被愂荅xception,表示可以被方法調(diào)用代碼處理的可恢復(fù)意外情形的“異常信息”。它又繼承自Throwable,Throwable是JVM可以throw(后面會(huì)講到)的所有類的基類,用來隨著方法調(diào)用棧向上傳遞表示產(chǎn)生此對(duì)象的方法的執(zhí)行環(huán)境的信息,封裝了一個(gè)字符串描述以及方法的調(diào)用棧信息。它的另一個(gè)子類是Error,它只能由Java運(yùn)行時(shí)本身錯(cuò)誤時(shí)被創(chuàng)建,我們的app不要去繼承它,也無法處理它。
接下來所談及的異常都是Exception的子類,不涉及Error。
Throwable類提供了有關(guān)異常的文本描述和調(diào)用堆棧:
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26