Throwable類是整個Java異常體系的超類,都有的異常類都是派生自這個類。包含Error和Exception兩個直接子類。數據庫
Error類通常是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的致使的應用程序中斷,僅靠程序自己沒法恢復和預防,遇到這樣的錯誤,建議讓程序終止。
Exception是應用層面上最頂層的異常類,包含RuntimeException(運行時異常)和 Checked Exception(受檢異常)。編程
RuntimeException是一種Unchecked Exception,即表示編譯器不會檢查程序是否對RuntimeException做了處理,在程序中沒必要捕獲RuntimException類型的異常,也沒必要在方法體聲明拋出RuntimeException類。通常來講,RuntimeException發生的時候,表示程序中出現了編程錯誤,因此應該找出錯誤修改程序,而不是去捕獲RuntimeException。網絡
常見的Runtime異常:ide
ArithmeticException(算術異常) 1/0函數
ClassCastException (類轉換異常)integer轉換string異常指針
IllegalArgumentException (非法參數異常) 參數爲int輸出倒是stringcode
NullPointerException (空指針異常)blog
Checked Exception是相對於Unchecked Exception而言的,全部繼承自Exception而且不是RuntimeException的異常都是Checked Exception。JAVA 語言規定必須對checked Exception做處理,編譯器會對此做檢查,要麼在方法體中聲明拋出checked Exception,要麼使用catch語句捕獲checked Exception進行處理,否則不能經過編譯。繼承
經常使用的Checked Exception有內存
IOException、
ClassNotFoundException 找到不到指定類
Java異常處理涉及到五個關鍵字,分別是:try、catch、finally、throw、throws。下面將驟一介紹,經過認識這五個關鍵字,掌握基本異常處理知識。
• try -- 用於監聽。將要被監聽的代碼(可能拋出異常的代碼)放在try語句塊以內,當try語句塊內發生異常時,異常就被拋出。
• catch -- 用於捕獲異常。catch用來捕獲try語句塊中發生的異常。
• finally -- finally語句塊老是會被執行。它主要用於回收在try塊裏打開的物力資源(如數據庫鏈接、網絡鏈接和磁盤文件)。只有finally塊執行完成以後,纔會回來執行try或者catch塊中的return或者throw語句,若是finally中使用了return或者throw等終止方法的語句,則就不會跳回執行,直接中止。
• throw -- 用於拋出特定的異常。
• throws -- 用在方法簽名中,用於聲明該方法可能拋出的異常。
多重catch編寫注意:
catch異常控制的範圍應該由小及大,若是把父類異常寫到前面,會屏蔽後面的子類異常。由於一次只會有一個catch會被匹配到。
RuntimeException異常類包括運行時各類常見的異常,ArithmeticException類和ArrayIndexOutOfBoundsException類都是它的子類。所以,RuntimeException異常類的catch子句應該放在最後面,不然可能會屏蔽其後的特定異常處理或引發編譯錯誤。
Throw: 寫在函數方法內部的,拋出指定的異常。
Throws: 修飾函數頭部
Throws拋出異常的規則:
若是想要拋出的是不受檢查異常(unchecked exception),那麼能夠不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利經過,但在運行時會被系統拋出。好比你throws了RuntimeException,可是他是unchecked類型異常,引用時不須要用try catch包圍起來。
public class ExceptionDemo2 { static void throw1() throws RuntimeException { System.out.println("Inside throw1 . "); throw new RuntimeException("demo"); } public static void main(String[] args){ throw1(); } }
若是想要拋出的是檢查異常(checked exception)。要麼用try-catch語句捕獲,要麼用throws子句聲明將它拋出,不然會致使編譯錯誤。
public class ExceptionDemo2 { static void throw1() throws IllegalAccessException { System.out.println("Inside throw1 . "); throw new IllegalAccessException("demo"); } public static void main(String[] args){ try { throw1(); }catch(IllegalAccessException e ){ System.out.println("Caught " + e); } } }