1.什麼是Error
Error是指嚴重的系統錯誤,一般指與JVM相關的問題,如系統崩潰,JVM出錯,動態鏈接失敗,內存耗盡等。這類錯誤無法恢復或不可捕捉,將應用程序中斷。
2.什麼是Exception
異常是程序運行期間對例外情況(非正常情況)的處理方式。異常的作用是從錯誤中恢復信息,列出異常信息,對問題進行處理。
發生異常時,異常對象被自動提交給JVM,JVM尋找處理這一異常的方法,稱爲捕捉異常。如果找不到可又捕捉異常的方法,則應用系統中斷,java程序退出。
檢查性異常:java.lang.Exception具體應用負擔的責任。
運行期異常:java.lang.RuntimeException程序負擔的責任。
錯誤:java.lang.ErrorJVM負擔的責任。
3.throw 和 throws
throws聲明。如何得知方法會拋出異常,方法聲明中有throws語句。
throw拋出異常。
4.拋出與捕捉
編寫可能會拋出異常的方法時,必須聲明異常。
調用可能會拋出異常的方法時,必須捕捉異常。
處理異常情況:把調用放在try/catch塊中,將異常處理/恢復程序放在catch塊中。
5.受檢異常
受檢異常是程序運行時由外界因素造成的。
編譯器會檢查除RuntimeException外的異常。確定調用者瞭解調用的方法是有異常的。如ClassNotFoundException,FileNotFoundException,IOException,SQLException.
6.非受檢異常RuntimeException
非受檢異大部分是由於程序邏輯造成的,程序員應該積極避免。如ClassCastException,ArrayIndexOutOfBoundsException,NullPointerException,ArithmeticException(除0異常)。
7.try、catch、finally
程序正常運行時,執行try塊中的內容,不執行catch的內容。
程序某行發生異常時,其後的程序不再執行,而執行catch塊。
finally是無論發生異常與否都會執行。如果try/catch中有return指令,finally還是會執行,流程會跳到finally再回到return語句。
8.多重異常
發生哪種類型的異常,執行哪個異常塊。如發生B類異常,則執行b。
如果發生B類異常,e會不會執行?不會,JVM從頭開始找到符合的catch塊,找到後就會知道其餘的都是沒用的。
try{
...
}catch(AException a){
...
}catch(BException b){
...
}catch(Exception e){
...
}
9.異常的多態
異常也是對象,可以以異常的父類型來聲明拋出的異常。比如,上述例子中可以只有最後一個catch塊。
什麼時候用多態呢?如果兩種異常的處理方式不同,則分開寫,這樣更容易知道發生的是哪種異常。如果兩種異常處理方式相同,則可以用多態聲明父類異常。
10.duck 聲明
當A調用的方法B有異常時,可以選擇不去catch,而把異常duck掉讓調用A方法的C去catch。也就是不處理異常,一直往上拋,但是當main方法也不去catch這些異常(也就是直接duck掉)時,jvm只好中斷。
http://lavasoft.blog.51cto.com/62575/18920/轉:
1、避免過大的try塊,不要把不會出現異常的代碼放到try塊裏面,儘量保持一個try塊對應一個或多個異常。
2、細化異常的類型,不要不管什麼類型的異常都寫成Excetpion。
3、catch塊儘量保持一個塊捕獲一類異常,不要忽略捕獲的異常,捕獲到後要麼處理,要麼轉譯,要麼重新拋出新類型的異常。
4、不要把自己能處理的異常拋給別人。
5、不要用try...catch參與控制程序流程,異常控制的根本目的是處理程序的非正常情況。