Java筆記-08 異常

異常

  • 異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數爲零、需要處理的文件不存在、數組下標越界等。 在Java的異常處理機制中,引進了很多用來描述和處理異常的類,稱爲異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。
  • 異常處理過程
  1. 拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,並把異常對象提交給JRE。

  2. 捕獲異常:JRE得到該異常後,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼爲止。

        try {
            System.out.println(1 / 0);
        }catch (Exception e){
            System.out.println("出錯了");
            e.printStackTrace();
        }
  • 所有異常的根類爲java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,異常又分爲受檢異常和不受檢異常(運行時異常)
  • Error是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題

運行時異常RuntimeException

  • 派生於RuntimeException的異常,如被 0 除、數組下標越界、空指針等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大。 因此由系統自動檢測並將它們交給缺省的異常處理程序(用戶可不必對其處理)
  • 需要增加邏輯判斷處理

受檢異常CheckedException

  • 這類異常在編譯時就必須做出處理,否則無法通過編譯
  • 異常的處理方式有兩種:使用“try/catch”捕獲異常、使用“throws”聲明異常
  • try catch finally,可以有多個catch
        try {
            System.out.println("可能異常的語句");
            System.out.println(1 / 0);
        }catch (Exception e){
            System.out.println("出錯了");
            //e.printStackTrace();
        }finally {
            System.out.println("總算結束了");
        }
  • 讀文件
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestReadFile {
    public static void main(String[] args) {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader("D:\\data\\shuihu.txt");
            char c1 = (char)fileReader.read();
            System.out.println(c1);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) { //多個異常,子類在前,父類在後
            e.printStackTrace();
        }finally {
            if(fileReader != null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

throws

  • 當CheckedException產生時,不一定立刻處理它,可以再把異常throws出去,
  • 如果一個方法中可能產生某種異常,但是並不能確定如何處理這種異常,則應根據異常規範在方法的首部聲明該方法可能拋出的異常。 如果一個方法拋出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestThrow {
    public static void main(String[] args) {
        String path = "D:\\data\\shuihu.txt";
        //處理異常,或者在方法後繼續標記拋出異常
        try {
            readFile(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static void readFile(String path) throws IOException {

        FileReader fileReader = new FileReader(path);
        char c1 = (char)fileReader.read();
        System.out.println(c1);

        if(fileReader != null){
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

自定義異常

  • 自定義異常類如果繼承Exception類,則爲受檢查異常,必須對其進行處理;如果不想處理,可以讓自定義異常類繼承運行時異常RuntimeException類。
  • 習慣上,自定義異常類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器。
public class TestDefinedException {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(10000);
        p.setName("高爾基 西莫維奇·彼什科夫");
    }
}

class Person{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 0 || age > 130){
            //運行時異常
            throw new IllegalAgeException("年齡有誤");
        }else{
            this.age = age;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name.length()>10){
            try {
                //Name的受檢異常,必須trycatch或方法後標記拋出
                throw new IllegalNameException("名字太長");
            } catch (IllegalNameException e) {
                e.printStackTrace();
            }
        }else {
            this.name = name;
        }
    }
}

class IllegalAgeException extends RuntimeException{
    /*
    運行時異常
     */
    public IllegalAgeException(){
    }
    public IllegalAgeException(String info){
        super(info);
    }
}
class IllegalNameException extends Exception{
    public IllegalNameException(){}
    public IllegalNameException(String info){
        super(info);
    }
}
發佈了75 篇原創文章 · 獲贊 83 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章