異常通常分為三類:
- 程序可控制的異常:一般是可預見的錯誤,不是致命的。例如:除數為0,數組下標越界。
- 程序不可控制的的異常:這種異常往往是致命的,但是系統可以預見的。例如:系統棧溢出。
- 人為異常
當系統底層出現異常時,實際上是將異常用一個對象包裝起來,傳給調用方,這個過程叫做拋出。
異常類一般都是Exception
的子類,類名通常以Exception
結尾。例如,NullPointerException
是一種比較常見的異常,叫做“未分配內存異常”,通常一個對象需要用new來分配內存,如果沒有分配內存的情況下就訪問它,就會拋出這種錯誤。
Throwable
類是類庫java.lang
包中的一個類,該類不能直接使用,它派生了兩個子類,Exception
和Error
。其中Error
是表示恢復很困難的一種嚴重錯誤,由系統保留。
- ArithmeticException: 算術異常,如除數為0。
- ArrayIndexOutOfBoundsException:數組越界異常。
- ArrayStoreException:數組存儲異常。
- ClassCastException:類型轉換異常。
- IllegalArgumentException:無效參數異常。
- NegativeArraySizeException:數組尺寸為負異常。
- NullPointerException:未分配內存異常。
- NumberFormatException:數字格式異常。
- StringIndexOutOfBoundsException:字符串越界異常
異常的就地捕獲(catch
):當程序發生異常 時系統捕獲異常轉而處理異常代碼。
格式如下:
try {//可能出現異常的代碼}
catch([xxx]Exception ex) {//[xxx]異常處理}
[finally{//不管異常是否出現都要運行的代碼,例如關閉文件等操作}]
例如:
try{
1:打開文件連接
2:讀文件
3:將文件中的字符串轉為數值
}
catch(文件型異常 ex1){ /*處理文件型異常*/ }
catch(字符串轉換型異常 ex2){ /*處理字符串轉換型異常*/ }
catch(Exception ex){ /*處理其他不可預見的異常*/ }
finally{ 4:關閉文件 }
復雜軟件之間可能由很多模塊構成,模塊之間存在復雜的調用關系,當莫格模塊發生異常時,可以不在模塊內處理異常,而將這個異常拋給調用方。
將需要將異常向前拋出的函數加上一個標記:throws XXXException
,表示可能向前拋出某種異常。
例如:
public void woek() throws NullPointerException//如果拋出多種異常,各種異常之間用逗號隔開
{}
如果拋出所有類型的異常就直接throws Exception
,如果一個方法有聲明異常,則調用這個的方法也必須聲明異常。
java中的main函數拋出的異常由JVM(java虛擬機)處理。
在java程序中如果異常都向外拋,直到try{}catch處捕獲;如果到了主方法(main方法)仍沒有捕獲,異常就由java虛擬機(java運行環境)處理
想要了解更多關于異常聲明可以移步:傳送門