Java學習之路(十):異常

---恢復內容開始---數據庫

異常的概述和分類

  Throwable類是Java語言中全部錯誤或者異常的超類(也就是說,Java中全部的報錯都是繼承與Throwable的),也只有當對象是此類或者此類的子類的實例之一時,纔可以經過Java虛擬機或者Javathrow語句進行拋出。數組

異常的繼承體系:

  • Throwable
    • Error,服務器宕機,數據庫崩潰等...
    • Exception
      • RuntimeException(運行期異常)

JVM默認是如何處理異常的?

  main函數收到異常的時候,會有兩種處理方式:服務器

    1.本身將該錯誤處理,讓後繼續執行代碼jvm

    2.本身沒有針對的處理方式,只有將其交給main的jvm來處理ide

JVM有一個默認的異常處理機制,就將該異常進行處理,並將該異常的名稱、異常的信息、異常出現的位置打印在控制檯上,同時程序中止運行。函數

本身處理異常的方式:

  • try...catch...finaly...
  • throws

咱們使用try...catch...finally...來捕獲異常,而後呢,能夠繼續執行咱們的代碼this

可是呢,咱們使用throw拋出異常的話就會結束程序了spa

catch(能夠寫多個錯誤類名){}    固然咱們也能夠是定義多個catch指針

Java中的異常被分爲兩大類

  • 運行時異常
  • 編譯時異常

注意:全部的RuntimeException類及其子類的實例被稱爲運行是異常,其餘異常就是編譯時異常code

編譯是異常:

  • 編譯時異常必須顯示處理,不然程序就會發生錯誤,沒法經過編譯

運行時異常:

  • 無需顯示處理,也能夠像編譯時異常同樣進行處理
  • 好比數組越界,空指針等都是運行時異常

Throwable的幾種常見的方法

Exception是一個繼承Throwable的子類

Throwable有幾個經常使用的方法:

  • getMJessage():獲取異常信息,返回字符串
  • toString():獲取異常類名和異常信息,返回字符串
  • printStackTrace():打印異常類名和異常信息,以及異常出如今程序的位置

throws的方式處理異常

  • 定義功能方法時,須要把出現的問題暴露出來讓調用這去處理
  • 那麼就經過throws在方法上標識
package null0801_2026;

public class Demo01 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Student std = new Student(11,"n1");
        std.setAge(11);
    }

}
class Student{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws Exception {
        if(age>10){
            throw new Exception("不能大於10");
        }else{
            this.age = age;
        }
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    
}

 

throw概述和throws的區別

throw的使用場景:

  在方法內部出現某種狀況,程序不能繼續執行,就用throw把異常對象拋出

throws和throw的區別

thorws:

  • 用在方法聲明的後面,跟的是異常類名
  • 能夠跟多個異常類名,用逗號隔開
  • 它表示拋出異常,由該方法的調用者來處理

thorw:

  • 用在方法體內,跟的是異常對象名
  • 只能拋出一個異常對象名,表示拋出異常

finally關鍵字的特色及應用

特色:

  • finally的語句體必定會執行
  • 特殊狀況:在執行到finally以前退出了(System.exit(0))

finally咱們通常用於IO流操做中的釋放資源

finally,final,finalize之間的區別

1.final能夠修飾類-表示不能被繼承,能夠修飾方法-表示不能被重寫,修飾變量-表示只能賦值一次

2.finally是try語句中的一個語句體,不能單獨使用,通常咱們用做IO中的釋放資源

3.finalize是一個方法,當垃圾回收器肯定不存在對該對象的更多引用的時候,由對象的垃圾回收器調用此方法。

 

異常的注意事項以及如何使用異常處理

  • 子類重寫父類方法時,子類的方法必須拋出相同的父類異常
  • 若是被重寫的方法沒有異常拋出,那麼子類的方法最好不要拋出異常
  • 若是子類方法內有異常發生,那麼只能只能用try catch

原則:若是本身能處理的問題就本身解決(try...catch),若是不能解決,就throws

如何自定義一個異常?例子:

package null0801_2026;

public class AgeError extends RuntimeException{

    public AgeError() {
        super();
        // TODO Auto-generated constructor stub
    }

    public AgeError(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
        super(arg0, arg1, arg2, arg3);
        // TODO Auto-generated constructor stub
    }

    public AgeError(String arg0, Throwable arg1) {
        super(arg0, arg1);
        // TODO Auto-generated constructor stub
    }

    public AgeError(String arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }

    public AgeError(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }
    
}
相關文章
相關標籤/搜索