java 異常機制

狂神視頻筆記

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 類即可.

在程序中使用自定義異常類, 大體可分為以下幾個步驟:

  1. 創(chuàng)建自定義異常類.
  2. 在方法中通過 throw 關(guān)鍵字拋出異常對象
  3. 如果在當(dāng)前拋出異常的方法中處理異常, 可以使用 try-catch 語句捕獲異常并處理;否則在方法的聲明處通過 throws 關(guān)鍵字指明要拋出給方法調(diào)用者的異常, 繼續(xù)執(zhí)行下一步操作.
  4. 在出現(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 語句塊去釋放占用的資源
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 128,110評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,392評論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,831評論 28 54
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,766評論 2 9

友情鏈接更多精彩內(nèi)容