異常概述

程序在運行中總會面臨一些“意外”情況,良好的代碼需要對它們進行預(yù)防和處理。大致來說,這些意外情況分三類:

  • 交互輸入
    用戶以非預(yù)期的方式使用程序,比如非法輸入,不正當?shù)牟僮黜樞?,輸入文件錯誤等。

  • 軟件和硬件環(huán)境問題
    文件不存在,文件格式錯誤,網(wǎng)絡(luò)問題,存儲空間不足,需要的預(yù)安裝庫不存在,系統(tǒng)版本不匹配等。

  • 代碼錯誤
    使用的其它代碼可能的執(zhí)行錯誤,如調(diào)用了有關(guān)數(shù)學(xué)計算的方法中執(zhí)行了除0操作等。

發(fā)現(xiàn)異常和處理異常都是困難的,需要非常嚴謹?shù)拇a。實際上,程序總是分層或分模塊的,往往發(fā)生異常的地方和最終調(diào)用的地方“相距”甚遠。而且,異常的處理有時需要通知用戶,甚至需要用戶來決定接下來的動作。又或者,程序運行在“后臺”,對錯誤的只能是記錄措施。異常發(fā)生后,有的情況是需要從錯誤的狀態(tài)中恢復(fù)再繼續(xù)執(zhí)行,又或者是保存狀態(tài)然后終止執(zhí)行等。

有關(guān)異常的發(fā)現(xiàn)和預(yù)防是一個具體問題具體對待的經(jīng)驗之談。對于異常處理框架,關(guān)鍵包括異常的表示、傳遞和捕獲。接下來我們結(jié)合Java提供的異常處理機制來學(xué)習(xí)下如何在正常的程序邏輯中加入異常處理的代碼。

Java中的異常處理機制

異常信息是為了通知更上層的方法調(diào)用者有關(guān)意外的情況,所以它有一個隨方法調(diào)用棧向上傳遞的過程,異常信息會像返回值那樣被層層上傳,直到有方法處理它。

作為面向?qū)ο笳Z言,Java提供給我們的幾乎都是類、接口這些編程元素。異常處理也不例外,Java并不選擇使用返回值來表示異常信息(因為有時返回值無法表達異常情況,而且會搞亂正常的返回值含意,想象下返回任意int值的方法。你依然可以對返回值做很多約定,使用參數(shù)來攜帶異常信息也是受限的),而是定義了Throwable相關(guān)的類層次來表示異常。這樣可以保證正常代碼執(zhí)行的簡明流程,而“異常發(fā)生”后將產(chǎn)生一個Throwable對象并隨著調(diào)用棧向上傳遞,對應(yīng)方法立即退出,沒有任何返回值,調(diào)用方法的代碼收到異常后繼續(xù)退出并上傳到更上層方法調(diào)用,或者捕獲此異常。
接下來就依次來了解下Java異常框架提供的異常表示、傳遞和捕獲處理相關(guān)的實現(xiàn)細節(jié)。

異常表示:Throwable繼承層次

Java中的“異常”基類是Exception,表示可以被方法調(diào)用代碼處理的可恢復(fù)意外情形的“異常信息”。它又繼承自Throwable,Throwable是JVM可以throw(后面會講到)的所有類的基類,用來隨著方法調(diào)用棧向上傳遞表示產(chǎn)生此對象的方法的執(zhí)行環(huán)境的信息,封裝了一個字符串描述以及方法的調(diào)用棧信息。它的另一個子類是Error,它只能由Java運行時本身錯誤時被創(chuàng)建,我們的app不要去繼承它,也無法處理它。

接下來所談及的異常都是Exception的子類,不涉及Error。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

Throwable類提供了有關(guān)異常的文本描述和調(diào)用堆棧:

        		

網(wǎng)友評論