異常的分類、拋出、捕獲及自定義異常類


需要掌握的三種異常類型

非運行時異常

運行時異常

  1. ArrayIndexOutOfBoudsException(數組下標越界)

  2. NullPointerException(空指針異常)

  3. ArithmeticException (算術異常)

  4. MissingResourceException(丟失資源)

  5. ClassNotFoundException(找不到類)等

這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。一般都是由於程序邏輯錯誤引起的,應該從邏輯角度盡可能避免這些異常的發生。

錯誤ERROR

  1. 由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關

  2. Java虛擬機運行錯誤,當jvm不再有繼續執行操作所需的內存資源時,將出現OutOfMemoryError。jvm會選擇線程終止。

  3. jvm試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、連接錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行是不允許出現的狀況。

 

異常處理機制

拋出異常

Test3
package com.Exception.demo01;

public class Test3 {
   public static void main(String[] args) {
       new Test3().test(1,0);
  }

   //假設在方法中,處理不了這個異常,方法上拋出異常
   public void test(int a,int b){
       if (b==0){
           throw new ArithmeticException(); //主動拋出異常,一般在方法中使用
      }
       System.out.println(a/b);
  }
}

捕獲異常

package com.Exception.demo01;


public class Demo01 {
   public static void main(String[] args) {
       int a = 1;
       int b = 0;

       try {//try 監控區域
           System.out.println(a/b);
      }catch(ArithmeticException e){// catch 捕獲異常
           System.out.println("程序出現錯誤,變量b不能為0");
      }finally {
           System.out.println("finally");
      }

       //finally 可以不要fanally 假設IO、資源、關閉!
  }

}

捕獲多個異常

package com.Exception.demo01;

public class Test {
   public static void main(String[] args) {
       int a = 1;
       int b = 0;

       //假設要捕獲多個異常:從小到大

       try {//try 監控區域
           System.out.println(a/b);;
      }catch(Error e){// catch(想要捕獲的異常類型) 捕獲異常
           System.out.println("Error");
      }catch (Exception e){
           System.out.println("Exception");
      }catch (Throwable t){
           System.out.println("Throwable");
      } finally {//處理善后工作
           System.out.println("finally");
      }

       //finally 可以不要fanally 假設IO、資源、關閉!
  }

}
快捷鍵 Ctrl + Alt + T
package com.Exception.demo01;

public class Test2 {
   public static void main(String[] args) {
       int a =1;
       int b = 0;

       //Ctrl + Alt + T
       try {
           System.out.println(a/b);
      } catch (Exception e) {
           e.printStackTrace(); //打印錯誤的棧信息
      } finally {
      }
  }
}

自定義異常類

用戶自定義異常類,只需繼承Exception類即可。

使用自定義異常類的步驟
  1. 創建自定義異常類

  2. 在方法中通過throw關鍵字拋出異常對象

  3. 如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明出通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作

  4. 在出現異常方法的調用者中捕獲並處理異常。

MyException
package com.Exception.demo02;

//自定義的異常類
public class MyException extends Exception{

   //傳遞數字> 10;
   private int detail;

   public MyException(int a){
       this.detail = a;
  }

   //toString:異常的打印信息

   @Override
   public String toString() {
       return "MyException{" + "detail=" + detail + '}';
  }
}
Test
package com.Exception.demo02;

public class Test {

   //可能會存在異常的方法

   static void test(int a) throws MyException {

       System.out.println("傳遞的參數是:" + a); //拋出

       if (a > 10){
           throw new MyException(a);
      }
  }

   public static void main(String[] args) {
       try {
           test(11);
                  }catch (MyException e){
           System.out.println("MyException=> " + e);
      }
  }
}

實際應用中的經驗總結

  1. 處理運行時異常時,采用邏輯去合理規避同時輔助try-catch處理

  2. 在多重catch塊后面,可以加一個catch(Exception)來處理可能會被遺漏的異常

  3. 對於不確定的代碼,也可以加上try-catch,處理潛在的異常

  4. 盡量去處理異常,切忌只是簡單地調用printStackTrace()去打印輸出

  5. 具體如何處理異常,要根據不同的業務需求和異常類型去決定

  6. 盡量添加finally語句塊去釋放占用的資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM