1. 程式人生 > 實用技巧 >Java異常體系

Java異常體系

Java異常體系

  Java中把容易出現的異常情況都封裝成了物件,這些物件就構成了Java異常體系。

1 Java異常體系結構

  -java.lang.Object

    -java .lang.Throwable

      -java.lang.Error

      -java.lang.Exception

1.1 Throwable

  所有異常和錯誤的超類,只有當物件是此類及其子類的例項時,才能通過Java虛擬機器或者Java throw 語句丟擲。類似地,只有此類或其子類之一才可以是 catch 子句中的引數型別。

  Throwable中的方法:

    -getMessage():獲取異常資訊,返回字串。

    -toString():獲取異常類名和異常資訊,返回字串。

    -printStackTrace():輸出異常類名和異常資訊,以及異常出現在程式中的位置。

    -printStackTrace(PrintStream s):通常用該方法將異常內容輸出到日誌檔案中,以便檢視,類似於重定向。

1.2 Error

  通常指程式中出現了重大問題,例如執行的類不存在或者記憶體溢位等。不編寫針對程式碼對其處理。

1.3 Exception

  程式在執行時出現的異常情況,可以通過try...catch...finally捕獲解決。

1.4 關鍵字throws和throw的區別

  -throws:用在方法上,後面跟異常的類名,用於宣告異常,標識方法會暴露出的異常。在定義方法時,需要把會出現的問題暴露出來讓呼叫者去處理,就用throws在方法上標識出來。

  -throw:用在方法內,後面跟異常物件,用於丟擲異常物件,相當於new一個異常物件。在方法內 出現某種情況,使程式不能繼續執行,需要進行跳轉時,用throw把異常物件丟擲。

2 try...catch...finally

 try {
           //需要檢測的程式碼
       }catch (異常類 變數名){ //(Exception e) 或 (Throwable e)
           //異常處理程式碼
       }finally {
           //最終都會執行的程式碼
       }

  -finally程式碼塊只有一種情況不會被執行:那就是在finally之前執行了System.exit(0)。finally程式碼塊通常用來關閉資源(資料庫連線,IO流等)。

  -try是一個獨立的程式碼塊,在try中定義的變數只能在try塊中使用,如果想在try塊外使用,則需在try外建立引用,在try中初始化。

  -catch語句可以定義多個,但子類異常需要先catch,否則程式碼不可達,編譯不通過。

  -方法在重寫時,不能丟擲新的異常型別,只能丟擲原有異常型別及其子類。

3 自定義異常

自定義異常步驟:

  -自定義類繼承Exception或其子類。

  -通過建構函式定義異常資訊。

例:自定義AgeTooSmallException和AgeTooBigException異常,當一個人的年齡不合法時,丟擲該異常。

package com.yss.gyg.exception;

public class AgeTooSmallException extends Exception {

    public AgeTooSmallException() {
    }

    public AgeTooSmallException(String message) {
        super(message);
    }
}
AgeTooSmallException
package com.yss.gyg.exception;

public class AgeTooBigException extends Exception {

    public AgeTooBigException() {
    }

    public AgeTooBigException(String message) {
        super(message);
    }
}
AgeTooBigException
package com.yss.gyg.test;

import com.yss.gyg.exception.AgeTooBigException;
import com.yss.gyg.exception.AgeTooSmallException;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws AgeTooSmallException, AgeTooBigException {
        if (age < 0) {
            throw new AgeTooSmallException("年齡小於0,不合法");
        }
        if (age > 200) {
            throw new AgeTooBigException("年齡大於200,不合法");
        }
        this.age = age;
    }
}
Person
package com.yss.gyg.test;

import com.yss.gyg.exception.AgeTooBigException;
import com.yss.gyg.exception.AgeTooSmallException;

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

        Person p = new Person();
        try {
            //p.setAge(-1);
            p.setAge(201);
        } catch (AgeTooSmallException e) {
            e.printStackTrace();
        } catch (AgeTooBigException e) {
            e.printStackTrace();
        }


    }


}
/*com.yss.gyg.exception.AgeTooBigException: 年齡大於200,不合法
    at com.yss.gyg.test.Person.setAge(Person.java:35)
    at com.yss.gyg.test.TestException01.main(TestException01.java:12)*/
TestException01