1. 程式人生 > >Java異常機制總結

Java異常機制總結

在java中,異常機制用的比C++頻繁,但是一直沒有比較系統完整地對java的異常機制作總結,使用異常的過程中總有點心裡沒底的感覺,這次進行一次相對完整的總結

首先是java的異常機制繼承體系:

Java的異常機制分成兩大類:error(錯誤)和exception(異常),這兩大類都繼承於一個父類Throwable。

error(錯誤):一般是指虛擬機器執行時關於虛擬機器的報錯,比較常見的是記憶體不足錯誤OutOfMemoryErro,還有類定義錯誤NoClassDefFoundError

exception(異常):異常類的子類又分成兩大類:

一個是RuntimeException(執行時異常)和其子類,屬於不檢查異常

,什麼意思呢,就是說不用明顯地進行捕捉和丟擲宣告就可以通過編譯,也就是說這種異常java預設是不需要進一步處理的,那大家會有問,照這種做法,一層層往上拋不就會結束了整個程式的運行了嗎?是的,這也就是java希望得到的效果,為什麼,因為這種異常是編碼的邏輯錯誤引起的,對程式業務而言是致命的,所以java更希望用這種嚴重的後果提醒你及時修改程式碼,而不是進行捕捉處理。一般常見的執行時異常有NullPointerException,ArithmeticException,ArrayIndexOutOfBoundException

另一個是非執行時異常,也就是編譯異常,屬於可查異常,什麼意思,就是如果出現這類異常,java傾向你去捕獲處理異常,如果你不明顯得捕獲異常或者宣告往上層丟擲異常,那麼編譯都通不過。這種異常一般是jdk應用類層級異常類或者是使用者自定義異常類。比如IOException、SQLException,這種可以明顯看出是應用層級的異常類。所以編譯異常應該進行捕獲處理以免導致應用級別的不確定性故障。

瞭解了上面的異常機制繼承體系,以後見到各種異常類就能做到心裡有底。知道該怎麼處理。網上有句話我覺得總結的很好:總體來說,Java規定:對於可查異常必須捕捉、或者宣告丟擲。允許忽略不可查的RuntimeException和Error。

原因就是後者是非常嚴重的並且絕大部分情況下不是使用者所希望得到的後果,越早發現解決越好。

其次是異常處理過程語句一些需要注意的地方:

try、catch 和 finally大家都比較熟,不再講普通語法了,而是強調下注意點:

1.  Try後面必須跟cath和finally至少一個。是的,後面直接跟finally而沒有cath也是可以

2.  Finally正常情況下是必須執行的,並且在return語句返回前執行,除非在執行Finally前程式掛掉了。這個以前我以前一個誤區,希望大家注意

3.  Throw異常鏈是從方法呼叫棧遞迴網上傳遞的,如果一直到main函式都沒處理就會使整個程式程序終止

4.  在跑完捕獲語句中就算對子類異常物件的引用就算用父類名進行強制轉換,再丟擲是會被後續的子類捕獲語句所捕獲的,原因就是java中對引用型別的轉換不會影響所引用真正物件型別,所以還是會被後續子類異常捕獲語句捕獲。

5.  還有一個是之前不知道的一個知識點所有能被throw的物件的型別必須是Throwable的子類。

6.  當父類的方法中有宣告throws異常類,其子類重寫父類的該方法時宣告throws時自能使父類所宣告的異常類或其子類或者選擇不丟擲,但不能是其他異常類,否則編譯通不過。這點跟方法的返回值型別類似。