異常(Exception)


1.什么是異常

2.異常體系結構

  • Java把異常當做對象來處理,並定義了一個基類java.lang.Throwable作為所有異常的超類。

  • 在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception

img

Error

  • Error類對象由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關。

  • Java虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的內存資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;

 

Exception

  • 在Exception分支中有一個重要的子類RuntimeException(運行時異常)

    • ArraylndexOutOfBoundsException(數組下標越界)

    • NullPointerException(空指針異常)

    • ArithmeticException(算數異常)

    • MissingResourceException(丟失資源)

    • ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理

  • 這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生;

  • Error和Exception的區別:Error通常是災難性的致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程序處理的,並且在程序中應該盡可能的去處理這些異常。

3.Java異常處理機制

  • 拋出異常

  • 捕獲異常

  • 異常處理五個關鍵字

    • try 、catch、 finally 、throw、throws

 

4.處理異常

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 可以不要finally ,假設IO,資源,關閉

  }
  public void a(){
          b();
  }
  public void b(){
      a();
  }

 

 

public class Test2 {
  public static void main(String[] args) {


      int a =1;
      int b =0;

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

          }


}
}
public class Test {
  public static void main(String[] args) {

      try {
          new Test().test(1,0);
      } catch (Exception e) {
          e.printStackTrace();
      }

  }

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

  }
}

5.自定義異常

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

    • 1.創建自定義異常類

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

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

    • 4.在出現異常方法的調用者中鋪貨並處理異常。

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


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

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

  //toString:異常的打印信息
  @Override
  public String toString() {
      return "MyException{"+ detail + '}';
  }
}
public class Test {

  //可能會存在異常的方法
  static void test(int a) throws MyException {

      System.out.println("傳遞的參數為:"+a);
      if(a>10){
          throw new MyException(a);//拋出

      }
      System.out.println("OK");
  }

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

6.總結

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

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

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

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

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

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


免責聲明!

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



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