前面扯過一篇淺談面向對象與女媧造人,今兒我接着扯……
在我的理解中,所謂的異常機制也就是讓程序在出現某些錯誤的情況下還能繼續執行完
如同兩個人在戀愛,雖然出現各種問題,但還是希望將來能繼續走下去
在java的異常結構中有一個頂級父類叫做Throwable,這個父類具有兩個子類,分別是:
Error
Exception
為了便於初學者能更好的理解異常機制,我姑且先列舉一些不恰當的例子:
可以這樣理解Error
1.你某天很舒服的坐在沙發上看電視,你爸突然把你拉到書房里語重心長的對你說:
“你和她不能在一起,她其實是你失散多年的親妹妹”(神馬感覺,心里一萬只草泥馬在奔跑對不對?)
2.終於能在一起了,尼瑪突然在她房間抽屜發現當年變性手術的費用單(這次不只一萬只了)。
兩個例子都有一個共同點,就是你不會和她繼續在一起了,你們的結合會是一種Error(錯誤),是硬傷!!!
對於這種根本無法解決或無法隱忍的情況就是所謂的Error,懂了吧
而在java語言中,Error則是代表硬件,jvm或代碼本身存在問題
雖然你對於無法處理這一情況很不甘心,但你還是會一遍遍檢查配置和你的代碼,以期望能夠解決
再看看Exception
把致命問題Error排除了(她是個好女孩),現在你和她能夠在一起(程序能夠繼續執行)又多了一份希望
但是,你仍然不能掉以輕心
兩個人相處,難免會產生一些不好的情緒,一旦你沒能處理好,那么兩個人的感情還是over(程序無法繼續執行)
在這里,Exception就是那些你要處理的情緒問題的總稱
為什么是總稱呢?因為大腦產生的情緒(異常)非常復雜,還可細分為各種情緒(糾結體)……
我們判斷一個人的情緒是靠經驗,比如產生這種壞情緒后,她有哪些行為和反映
在java里,Exception是一個父類,它還有很多的子類(也就是各種壞情緒的封裝)
你看,就這么簡單,我們就理解了整個java的異常體系
Throwable下的兩個已知子類,Error和Exception
Exception下的各個細分的異常
既然我們了解了java的異常體系,也知道了Error是無法處理的,那么我們能做的就是針對Exception的操作了
也就是在戀愛過程中,我們對她壞情緒的處理,好讓兩個人的感情能夠繼續……
那么如何操作呢?
很簡單,你只需要進行判斷和測試,確認她的行為是否符合你經驗中她這一壞情緒的反映,然后做出處理就行了
相信你一定知道基本的除數為0異常,這里就不再寫了,任何一本基礎書都有
為了避免針對性的代碼造成不好理解,我們下面都寫偽碼
實例1:典型的try...catch結構
//女友為什么是public?因為誰都能追 public class GirlFriend { //還記得嗎?你們的故事就是從這開始的 public static void main(String[] args) { //我們用try包裹的代碼來判斷和測試她不穩定的壞情緒 try { 她小情緒的反映 她小情緒的行為 她小情緒的眼神 …… //在實際中則是Exception e,你肯定知道 //為什么有個e對象,都說了異常也是一種類 //所謂的catch就是捉到她壞情緒的原因,並進行處理 } catch (工作累了異常 e) { //打印異常信息,你可以認為是她在訴說原因 //實際中我們要結合場景來處理 e.printStackTrace(); } } }
你看,這樣我們就能有針對性的處理單個異常了,在try里面測試
catch里面進行處理
當然,有時候一個人情緒不好是由於多種原因,那么你只能小心翼翼的根據經驗
來捕捉更多的異常(壞情緒的封裝對象),此時你也就需要多條catch語句了
實例2:復合的catch語句
try { ...... } catch (工作累了異常 e) { 捶背 } catch (口渴了異常 e) { 倒水 } catch (被鄙視了異常 e) { 安慰 //這里的Exception是所有壞情緒的父類 } catch (Exception e) { 各種安慰 各種獻殷勤 各種傾聽 }
為什么所有壞情緒對象(Exception)要放到最后捕捉呢?
很好理解,當你在無法確定她到底是累了,渴了還是怎么地產生的壞情緒時
你便可以認為,反正她就是特么的很煩,想鬧脾氣,你得處理!!!(不然就over)
好吧,你看到了,不論是討好女友還是處理異常,都是一件相當不爽的事
下面我們來看看一個很簡單,很朴實的關鍵字finally
實例3:finally語句的使用
try { ...... } catch (Exception e) { //Todo } finally { 不管你特么心情好不好 反正都是老子洗碗!!! 靠…… }
看,finally好用吧,你可以這樣理解
是男人就應該默默的承擔,不管有沒有異常,我都執行
在java中,finally最常用的場合就是最后關閉io流對象了,可見我寫的另一篇筆記
至此,我們已經講完了java異常的基礎操作
新手可能會問,咦?throws和throw兩大關鍵字去哪兒了
別急,咋慢慢來,去端杯茶緩緩……
對於throws在java中的意思是,讓調用處去處理這一異常
就比如說她們受了一頓悶氣,本來你不說還沒什么,你一說她們就忍不住了
把所有的火都對你發,誰讓你要去惹她們的?
自己可以處理卻不處理,俺們就叫做throws,一般在方法后面使用
實例4:throws的用法
public void 降低憤怒() throws 憤怒的異常 { /*你看,在這里明明可以try...catch的 但是卻沒有,把異常給拋到了調用處*/ ...... //這是處理方法,此處省略N行代碼 }
本來在降低憤怒()這一方法中可以try...catch的,但是不想,要留給招惹它的人
那就用throws吧,誰惹我誰遭殃
其實,女人是一種很奇怪的動物,她們有時候會假裝自己生氣
從而達到讓你哄的目的,典型的欠try有木有……
那么,這個時候throw就發揮了作用
在java中,throw表示人為的拋出一個異常
實例5:throw的用法
public void throwMethod() throws Exception { throw new 發嗲了異常("干爹,你來~~") }
這里在throwMethod方法中我們人為拋出了一個發嗲了異常,然后給調用處try
至於catch部分的內容,你們自己看着辦……(尼瑪,我才19怎么就那么邪惡了)
再來,我們在翻看API文檔的時候也許會發現類似下面的方法
它們明明拋出了異常,而我們在使用中卻沒有try,這是怎么回事?
這叫做RuntimeException,也就是運行時異常,它們可try可不try
因為一旦產生這種異常就說明你的代碼可能存在問題,比如數組下標越界等
此時,try...catch意義不大,檢查和修改源碼才是最佳選擇
最后來說說自定義異常,自定義異常一般用的不是很多,可以這樣理解:
有時候你的女友亂發脾氣,完全不按套路出牌,令你不知所措,以前的經驗在此也似乎失效
那么,此時我們就可以定義一個自定義異常來描述這種情況
public class CustomException extends Exception { public CustomException(String msg) { super(msg); } }
如果想測試的話,可以throw一個新的CustomException對象,構造方法中加入信息就可以了
然后你懂的,try...catch處理
很簡單,就沒必要演示了