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