異常(Exception)
下圖方格內容為java.lang.Object中的類,箭頭為繼承關系

異常類型
RunTimeException
運行時異常:
此類異常為unchecked(非受查)
即編譯不會檢測出異常,運行時才會出現的異常
常見的類型有:
- NullPointerException
- ArithmeticException
- ClassCastException
- IndexOutOfBoundsException
- IllegalArgumentException
OtherException(編譯時異常)
編譯時異常:
此類異常為checked(受查)
即編譯時會檢測出異常
常見的類型有:
- FileNotFoundException
- ClassNotFoundException
- SQLException
- NoSuchFieldException
- NoSuchMethodException
- ParseException
錯誤與異常區別
- 異常可以是受查或非受查的,錯誤總是非受查的;
- 異常是由代碼導致的,錯誤是由系統或者低層資源導致的;
- 異常在應用級被處理,能夠識別的錯誤會在系統級被捕捉;
異常處理
捕獲異常:try&catch&finally
try{...}
// one or more catch statements
catch (<$EX_CLASS> <$VAR_NAME> [|<$EX_CLASS> <$VAR_NAME> [...]]){...}
finally{...}
- try:運行代碼,若遇到異常則try內代碼停止運行
- catch:若前者出現異常,將捕獲異常並運行catch代碼
若前者為出現異常,則無法捕獲異常,catch內代碼也不會運行 - finally:無論是否出現異常,無差別運行finally內代碼
note that:
try內聲明的變量只能在try內部使用
示例:
public class DealException
{
public static void main(String args[])
{
try
//要檢查的程序語句
{
int a[] = new int[5];
a[10] = 7;//出現異常
}
catch(ArrayIndexOutOfBoundsException e)
//異常發生時的處理語句
{
System.out.println("超出數組范圍!");
}
finally
//這個代碼塊一定會被執行
{
System.out.println("*****");
}
System.out.println("異常處理結束!");
}
}
Tips:
- 一個try語句可以對應多個catch語句
- 若存在多個catch語句,按照java.lang.Object類從子到父排列
- 一個catch語句可以捕捉多個異常,不同異常之間用
|隔開 - 異常類聲明的對象默認被final修飾
拋出異常:throw
throw <$EX_OBJ>
其他異常拋出來自代碼邏輯,throw是主觀意願的手動拋出異常
兩者最終結果的作用相同
出現在函數體中,拋出異常后終止
聲明異常:throws
func throws <$EX_OBJ>
將自身異常提交給上級(調用者/JVM)
從而確保自身在編譯過程中不出現異常
自定義異常
- 創建類
- 繼承Exception或Exception的子類
- 重寫構造方法
如何讓自定義異常發揮作用?
依靠throw來拋出自定義的異常
public class NoMappingParamString extends Exception {
//無參構造函數
public NoMappingParamString(){
super();
}
//用詳細信息指定一個異常
public NoMappingParamString(String message){
super(message);
}
//用指定的詳細信息和原因構造一個新的異常
public NoMappingParamString(String message, Throwable cause){
super(message,cause);
}
//用指定原因構造一個新的異常
public NoMappingParamString(Throwable cause) {
super(cause);
}
}
Q&A
捕獲異常為什么不使用if&else,而是用try&catch&finally?**
- 代碼臃腫
- 處理繁瑣
- 無法區分業務代碼和異常代碼
throw與throws的異同
相同:
- throw與throws單詞類似
- 后均跟異常類
- 都是對異常的處理
不同:
- throw是給自己創造困難從而磨煉自己
throws是甩鍋給上級讓自己過的安穩 - throw寫在結構體中,throws寫在聲明方法中
