java 異常機制
graph LR
Throwable-->Error-->VirtulMachineError-->StackOverFlowError
VirtulMachineError-->OutOfMemoryError
Error-->AWTError
Throwable-->Exception-->IOException-->EoFException
IOException-->FileNotFoundException
Exception-->RuntimeException
RuntimeException-->ArrithmeticException
RuntimeException-->MissingResourceException
RuntimeException-->ClassNotFoundException
RuntimeException-->NullPointerException
RuntimeException-->IllegalArgumentException
RuntimeException-->ArrayIndexOutOfBoundsException
RuntimeException-->UnkownTypeException
Error 異常
- Error類 對象 由 java 虛擬機生成并 拋出, 大多數(shù)錯誤與代碼編寫者所執(zhí)行的操作無關(guān).
- java 虛擬機運行錯誤( Virtual MachineError), 當(dāng) JVM 不在有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時, 將出現(xiàn) OutOfMemoryError. 這些異常發(fā)生時, java 虛擬機 (JVM) 一般會選擇線程終止.
- 還有發(fā)生在虛擬機視圖執(zhí)行應(yīng)用時, 如類定義錯誤( NoClassDefFoundError), 鏈接錯誤( LinkageError ). 這些錯誤是不可查的, 因為它們在應(yīng)用程序的控制和處理能力之外, 而且絕大數(shù)是程序運行時不允許出現(xiàn)的狀況.
Exception 異常
- 在 Exception 分支中有一個重要的子類 RuntimeException (運行時異常)
- ArrayIndexOutBoundsException ( 數(shù)組下標(biāo)越界 )
- NullPointerException ( 空指針異常)
- ArithmeticException (算數(shù)異常)
- MissingResourceException (丟失資源)
- ClassNotFoundException (找不到類) 等異常, 這些異常是不檢查異常, 程序中可以選擇捕獲處理, 也可以不處理
- 這些異常一般是由程序邏輯錯誤引起的, 程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生.
- Error 和 Exception 的區(qū)別: Error 通常是災(zāi)難性的致命錯誤, 是程序無法控制和處理的, 當(dāng)出現(xiàn)這些異常時, java 虛擬機 ( Jvm ) 一般會選擇終止線程; Exception 通常情況下是可以被程序處理的, 并且在程序中應(yīng)該盡可能的去處理這些異常.
try catch finally
try{
/** 監(jiān)控區(qū)域 */
}catch(想要捕獲的異常類型){
/** 捕獲異常 */
}finally{
/** 善后工作,無論是否捕獲異常,都要執(zhí)行 */
}
try{}catch(){
}catch(){
}catch(Throwable){
// 從小到大捕獲
}
throw 主動拋出異常
public void test(){
int a = 0;
if(a==0){
/** 主動拋出異常, 一般在方法中使用 */
throw new ArithmeticException();
}
}
throws 在方法上拋出異常
public void test() throws ArithmeticException{
}
自定義異常
使用 java 內(nèi)置的異常類可以描述在編程時出現(xiàn)的大部分異常情況. 初此之外, 用戶還可以自定義異常. 用戶自定義異常類, 只需要繼承 Exception 類即可.
在程序中使用自定義異常類, 大體可分為以下幾個步驟:
- 創(chuàng)建自定義異常類.
- 在方法中通過 throw 關(guān)鍵字拋出異常對象
- 如果在當(dāng)前拋出異常的方法中處理異常, 可以使用 try-catch 語句捕獲異常并處理;否則在方法的聲明處通過 throws 關(guān)鍵字指明要拋出給方法調(diào)用者的異常, 繼續(xù)執(zhí)行下一步操作.
- 在出現(xiàn)異常方法的調(diào)用者中捕獲并處理異常.
自定義的異常類
// 自定義的異常類
public class MyException extends Exception{
// 傳遞數(shù)字 > 10;
private int detail;
public MyException(int a){
this.detail = a;
}
@Override
public String toString(){
return "MyException{" + "detail" + detail + "}";
}
}
實際應(yīng)用中的經(jīng)驗總結(jié)
- 處理運行時異常時,采用邏輯去合理規(guī)避同時輔助 try-catch 處理
- 在多重 catch 塊后面, 可以加上一個 catch (Exception)來處理可能會被遺漏的異常
- 對于不確定的代碼, 也可以加上一個 try-catch, 處理潛在的異常
- 盡量去處理異常, 切忌只是簡單的調(diào)用 printStackTrace() 去打印輸出
- 具體如何處理異常, 要根據(jù)不同的業(yè)務(wù)需求和異常類型去決定
- 盡量添加 finally 語句塊去釋放占用的資源