java里的異常多種多樣,這是一種非常有用的機制,它能幫助我們處理那些我們未知的錯誤,在java里,關於異常的有throw throws,還有一個try catch 程序塊。接下來我們挨個看看這幾個的作用。
1.throw
throw 就是拋出一個異常,並獲取這個異常的引用,這個異常會被拋到外部的環境,由外部環境進行處理
class A{ public void func() throws Exception{ throw new Exception(); } }
這里拋出了一個Exception,Exception是throwable的子類,是所有異常的基類。與此同時,throwable還有另一個子類,也就是Error。
這里會把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語句塊之后,程序終止了
2.throws
那我們就不得不說一下throws,其實throws並不是拋出一個實際的Exception而是一個異常聲明,它聲明這個方法可能會拋出一個異常,注意是可能,所以在沒有異常的情況下也是可以用throws的,而throws本身的作用也是用來提高程序的健壯性,反過來,如果這個方法的的確確的有一個異常,那么編譯器會強制讓你加上throws這個異常聲明。
通常throws是寫在參數列表的后面,這樣就表明這個方法有可能會拋出一個異常
class A{ public void func() throws Exception{ throw new Exception(); } public void g() throws Exception{ } }
3.try...catch
當我們在其環境中調用func 和 g的時候,編譯器會通知我們需要用一個Try catch程序塊來處理這個異常。
這個程序塊分兩塊,第一塊是try{} ,第二塊是catch(exception的引用){}
try這個程序塊很有意思,因為它的名字很易懂,就是嘗試,嘗試能不能正常的走完整個作用域,如果不能則拋出一個異常。所以我們在try塊里經常放上可能會拋出異常的程序段。
而catch恰好就是處理try里拋出來的異常,其中catch的參數列表接收的是一個異常的引用,是throw拋出來的異常的引用,這樣我們就可以得到這個異常的對象,倒不如說我們是得到來了這個異常對象的引用,因為在java里,通常我們也只能通過引用來操縱對象。
PS:當 throw new RuntimeException的時候,不用throws
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