異常是錯誤嗎???

Java 異常

異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。

比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(11/0),那麼你是因爲你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。

異常發生的原因有很多,通常包含以下幾大類:

  • 用戶輸入了非法數據。
  • 要打開的文件不存在。
  • 網絡通信時連接中斷,或者JVM內存溢出。

這些異常有的是因爲用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因爲物理錯誤引起的。-

一、異常的類型

  • 檢查型異常:用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略
  • 運行時異常 :運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略
  • 錯誤:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的

二、Excepion 類的層次

在這裏插入圖片描述

異常類有兩個主要的子類:IOException 類和 RuntimeException 類。

三、常見的異常類

異常類型 說明
Exception 異常層次結構的父類
ArithmeticException 算術錯誤情形,如以零作除數
ArrayIndexOutOfBoundsException 數組下標越界
NullPointerException 嘗試訪問 null 對象成員
ClassNotFoundException 不能加載所需的類
IllegalArgumentException 方法接收到非法參數
ClassCastException 對象強制類型轉換出錯
NumberFormatException 數字格式轉換異常,如把"abc"轉換成數字

四、捕獲異常

使用 try 和 catch 關鍵字可以捕獲異常,try/catch 代碼塊放在異常可能發生的地方。try/catch代碼塊中的代碼稱爲保護代碼。

代碼格式:

try{
   // 程序代碼	
}catch(ExceptionName e1){
   //Catch 塊
}

五、多重捕獲塊

一個 try 代碼塊後面跟隨多個 catch 代碼塊的情況就叫多重捕獲。

代碼格式:

try{
   // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}

六、finaly

finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。

無論是否發生異常,finally 代碼塊中的代碼總會被執行。

在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。

代碼格式:

try{
  // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}finally{
  // 程序代碼
}

七、throws/ throw

throw throws
生成並拋出異常 聲明方法內拋出了異常
位於方法體內部,可作爲單獨語句使用 必須跟在方法參數列表後面,不能單獨使用
拋出一個異常對象,且只能是一個 聲明拋出異常類型,可以跟多個異常

八、聲明自定義異常

在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。

  • 所有異常都必須是 Throwable 的子類。
  • 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
  • 如果你想寫一個運行時異常類,那麼需要繼承 RuntimeException 類。

代碼格式:

class MyException extends Exception{
}

實例:

public class Age {
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 18){
            throw new AgeException();
        }
        this.age = age;
    }

    public Age(String name) {
        this.name = name;
    }



    private int age;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}




public class AgeException extends RuntimeException{

    @Override
    public String getMessage() {
        return "年齡大於18歲了";
    }
}





@Test
//自定義異常
public void test() {
    Age age = new Age("zzz");
    try {
        age.setAge(20);
    }catch (AgeException ae){
        ae.printStackTrace();
        System.out.println("-------------");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章