關於使用多個 catch 語句捕獲多個異常問題
當使用多個 catch 語句捕獲多個異常時, Java 規定捕獲 Exception 的 catch 語句必須排在最後,如下所示:
try { …… }
catch(ClassCastException ex){ …… }
catch(NumberFormatException ex){ …… }
catch(Exception ex){ …… } // 此句必須放在最後!
為什麼會有這個限制?
因為Exception這個是那幾個異常的 老爹!
那幾個異常都是他的娃,Exception放在最前面後面娃兒的還有機會嗎?
因為在用catch捕獲異常的時候,會根據catch(****)中的內容逐個執行,當發現到try中產生的異常和catch內的異常相同時候就會停止。否則會繼續向下執行,而Java.lang.Exception是所有異常類的父類。
所以你把它寫在最上面,。(這裡面體現了多型的特性)。
那麼下面再寫任何子類的異常是沒有意義的,因為是不會被執行的。
好像一般的unchecked 也就是RunTimeException是不允許把Exception寫在最上面的。好像寫了就會直接出現編譯錯誤,是無法編譯通過的。
它會先捕獲第一個catch,再捕獲第二個,也就是從裡到外,這樣的話,你把Exception ex放在最裡面,那麼,只要出錯就會捕獲這個,它可以捕獲所以的錯誤,那麼,後面的那幾個自己定義的catch就永遠也執行不到
java中,Throwable是所有的Exception和Error的基類,而就異常來說,Exception則是所有異常的基類,也就是Exception能捕獲所有型別的異常,所以在捕獲時,當然是從你能捕獲的最精確的異常開始啦,並且根據異常的型別進行相應的處理,依次是更大範圍的異常,所以當然是把Exception放在最後拉。
Exception是所有異常類的基類,其他所有異常類都是其子類,java捕捉異常的順序是從最裡層的開始逐漸往最外層的搜尋異常匹配(不知道能否這樣說,意思是沒錯啦),如果把Exception放到最前面,則不論丟擲什麼異常,Exception都能捕獲到,也就是說,不管你丟擲的異常型別是什麼,都會被Exception這個語句捕獲到,其他捕獲語句都沒用!