java裏的異常多種多樣,這是一種很是有用的機制,它能幫助咱們處理那些咱們未知的錯誤,在java裏,關於異常的有throw throws,還有一個try catch 程序塊。接下來咱們挨個看看這幾個的做用。java
throw 就是拋出一個異常,並獲取這個異常的引用,這個異常會被拋到外部的環境,由外部環境進行處理數據庫
class A{ public void func() throws Exception{ throw new Exception(); } }
這裏拋出了一個Exception,Exception是throwable的子類,是全部異常的基類。與此同時,throwable還有另外一個子類,也就是Error。swift
這裏會把Exception這個引用拋到外部環境中去處理。數組
throw跟try...catch...finally的對比:緩存
public
class
ZeroTest {
public
static
void
main(String[] args) {
try
{
int
i =
100
/
0
;
System.out.print(i);
}
catch
(Exception e){
System.out.print(
1
);
throw
new
RuntimeException();
}
finally
{
System.out.print(
2
);
}
System.out.print(
3
);
}
}
try catch是直接處理,處理完成以後程序繼續往下執行,throw則是將異常拋給它的上一級處理,程序便不往下執行了。
本題的catch語句塊裏面,打印完1以後,又拋出了一個RuntimeException,程序並無處理它,而是直接拋出,
所以執行完finally語句塊以後,程序終止了
那咱們就不得不說一下throws,其實throws並非拋出一個實際的Exception而是一個異常聲明,它聲明這個方法可能會拋出一個異常,注意是可能,因此在沒有異常的狀況下也是能夠用throws的,而throws自己的做用也是用來提升程序的健壯性,反過來,若是這個方法的的確確的有一個異常,那麼編譯器會強制讓你加上throws這個異常聲明。安全
一般throws是寫在參數列表的後面,這樣就代表這個方法有可能會拋出一個異常spa
class A{ public void func() throws Exception{ throw new Exception(); } public void g() throws Exception{ } }
當咱們在其環境中調用func 和 g的時候,編譯器會通知咱們須要用一個Try catch程序塊來處理這個異常。指針
這個程序塊分兩塊,第一塊是try{} ,第二塊是catch(exception的引用){}
try這個程序塊頗有意思,由於它的名字很易懂,就是嘗試,嘗試能不能正常的走完整個做用域,若是不能則拋出一個異常。因此咱們在try塊裏常常放上可能會拋出異常的程序段。
而catch剛好就是處理try裏拋出來的異常,其中catch的參數列表接收的是一個異常的引用,是throw拋出來的異常的引用,這樣咱們就能夠獲得這個異常的對象,倒不如說咱們是獲得來了這個異常對象的引用,由於在java裏,一般咱們也只能經過引用來操縱對象。code
PS:當 throw new RuntimeException的時候,不用throwsorm
public class Main { public static void main(String[] args){ A a = new A(); try{ a.func(); a.g(); } catch(Exception e){ System.out.println("捕獲了一個異常"); } } }
咱們捕獲了func 的異常,由於咱們明確的指明func 會拋出一個異常throw new Exception();因此咱們這裏也會捕獲到,並去處理它,因此運行起來咱們會看到控制檯上會打印「捕獲了一個異常」。
儘管g()沒有拋出任何的異常,編譯器仍是要求咱們要用try catch把它括起來,是由於它擁有一個throws 異常說明。
**下面是常見的幾種異常,供你們參考:
輸入輸出異常:IOException
算術異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
操做數據庫異常:SQLException
文件未找到異常:FileNotFoundException
數組負下標異常:NegativeArrayException
數組下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
文件已結束異常:EOFException
字符串轉換爲數字異常:NumberFormatException
方法未找到異常:NoSuchMethodException