異常知識點小總結

異常

異常的概念

異常:是指程序在運行過程中,出現的非正常的情況,最終會導致JVM非正常停止

注意:
異常並不是語法錯誤,語法錯誤編譯不通過,不會產生字節碼文件,根本不能運行

異常分類

在這裏插入圖片描述

異常處理

方法一:
alt+enter 拋出這個異常throws 將異常拋出給虛擬機處理
虛擬機處理異常的方式就是中斷處理,將程序中斷,將異常信息打印在控制檯

方法二:
alt+enter 選擇try catch異常
將異常處理之後程序可以繼續執行

try{
    //可能出現異常的代碼
}catch(Exception e){
    //異常的處理邏輯
}

異常的產生過程?

比如說數組越界異常,當訪問數組中不存在的索引時,JVM就會檢測出程序會出現異常,此時JVM會做兩件事:

  1. JVM會根據異常產生的原因創建一個異常對象,包含了異常產生的內容,原因,位置
  2. 在出現異常所在的方法中如果沒有異常的處理邏輯(try…catch),那麼JVM就會把異常對象拋出給方法的調用者(調用這個方法的方法)來處理這個異常,若是該方法的調用者也沒有異常的處理邏輯,那麼繼續將異常拋出給他的調用者

    最終會將拋給JVM
    JVM會執行兩步:
    1. 把異常對象(內容,原因,位置)以紅色的字體打印在控制檯
    2. JVM會終止當前正在執行的java程序—》中斷處理

異常的處理

拋出異常throw

throw關鍵字

  • 作用:使用throw關鍵字來拋出指定的異常。
  • 如何使用?
throw new xxException("異常產生的原因");

比如說傳遞的數組爲空

if(arr == null){
//對數組判空
	throw new NullPointerException("傳遞的數組的值是傳遞ull");
}
  • 使用時應該注意:
    1. throw必須卸載方法的內部
    2. 被throw拋出指定的異常對象後我們應該處理該異常
    (如果該異常對象是RuntimeException或是RuntimeException的子類我們可以不處理,默認交給JVM處理;如果後面跟的是編譯異常,我們就必須要處理)

注意:在寫方法時我們首先要對方法傳遞過來的參數進行合法性校驗,如果參數不合法,那麼必須要使用拋出異常的方式告知方法的調用者傳遞的參數有問題

異常的第一種處理方式–聲明異常throws

throws關鍵字

  • 作用:用throws聲明異常,將問題標識出來,報告給調用者。
    當方法內部拋出異常對象的時候,我們必須要處理這個異常對象
    可以使用throws關鍵字處理異常對象,會把異常對象聲明拋出給方法的調用者處理(自己不處理,給別人處理),最終交給JVM處理–》中斷處理
    關鍵字throws運用於方法聲明之上,用於表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常)
  • 如何使用:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2....{}
 public static void main(String[] args) throws InterruptedException {
        Thread.sleep(9999999L);
 }
  • 注意
    1. throws關鍵字必須要寫在方法聲明處
    2. 調用了一個聲明拋出異常的方法,我們就必須的處理聲明的異常
    (要麼繼續使用throws聲明拋出,交給方法的調用者處理,最終交給JVM;要麼try…catch自己處理異常)
  • 缺陷:
    異常後面的代碼不執行(因爲發現異常之後最終交給JVM處理,JVM中斷處理,後續代碼不執行)

異常的第二種處理方式 --捕獲異常 try catch

try-catch捕獲異常

  • 如何使用:
try{
	//可能會產生異常的代碼
}catch(異常類名 變量名){
	//處理異常對象的方法
}
...
  • 注意:
    1. try中可能會拋出多個異常對象,那麼就可以使用多個catch來處理這些異常對象
    2. 如果try中的代碼產生了異常,那麼就會執行catch中的異常處理代碼,執行完後繼續執行try-catch之後的代碼;
      如果try中的代碼沒有產生異常,那麼就不會執行catch中的異常處理代碼,而是繼續執行try-catch之後的代碼;

finally代碼塊

無論異常是否發生都會執行的代碼塊

使用注意

  1. finally 不能單獨使用,必須和try一起使用
  2. finally一般用於資源釋放(資源回收),無論程序是否出現異常,最後都要資源釋放
  3. 建議return不要放在finally塊中 因爲可能會抑制catch或try當中的return

異常注意事項

  • 運行時異常被拋出可以不處理,既不捕獲也不聲明拋出
  • 如果父類拋出了多個異常,父類覆蓋子類方法時,只能拋出相同的異常或是他的子類
  • 父類方法沒有拋出異常,子類覆蓋父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出
  • 在try catch後可追加finally代碼塊,其中的代碼一定會被執行,通常用於資源回收

自定義異常類

  • 如何定義:
    自定義異常時需要自己定義一個異常類實現 該類繼承於Exception或RuntimeException
    (繼承自 Exception 的異常默認是編譯異常(也叫受查異常),繼承自 RuntimeException 的異常默認是運行時異常)
  • 如何使用:
public class xException extends Exception/RuntimeException{
	添加一個空參數的構造方法
	添加一個帶異常信息的構造方法
}

格式類比空指針異常的源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章