java之異常

(1)任何一種程序設計語言設計的程序在運行時均可能出現錯誤。java

(2)捕獲錯誤最理想的是在編譯期間,但有的錯誤只有在運行時纔會發生。程序員

(3)對於這些錯誤,通常有兩種解決方法:編程

  • 遇到錯誤就終止程序運行;
  • 由程序員在編寫程序時,就考慮到可能出現的錯誤,並進行錯誤的檢測、錯誤的提示以及錯誤的處理;

那麼什麼是編譯,什麼是運行呢?網絡

編譯:又分爲編譯和連接兩個過程。編譯是將源文件轉換爲機器可識別的二進制文件。連接是將這些二進制文件組合成系統能夠執行的可執行文件。this

運行:將編譯出來的可執行程序放在系統中進行運行。spa

Java異常:在java語言中,將程序執行中發生的不正常狀況稱爲異常。設計

java中的異經常使用於處理非預期的狀況,如文件沒找到、網絡錯誤、非法的參數等。3d

java程序運行過程當中的異常可分爲兩類指針

  • Error:JVM系統內部錯誤、資源耗盡等嚴重狀況;
  • Exception:其它因編程緣由或偶然的外在因素致使的一致性問題,例如空指針訪問、試圖讀取不存在的文件、網絡鏈接中斷等。

異常處理機制code

  • 在編寫程序時,常常要在可能出錯誤的地方加上檢測的代碼;
  • java異常處理:java採用異常處理機制,將異常處理的程序代碼集中在一塊兒,與正常的程序代碼分開,使得程序簡潔,並利於維護;

說明

  • java提供的是異常處理的抓拋模型;
  • java程序的執行過程當中若果出現異常,會自動生成一個異常類對象,該異常對象將被提交給java運行時系統,這個過程稱爲拋出異常;
  • 若是在一個方法內拋出異常,該異常會被拋到調用的方法中,若是異常沒有在調用方法中處理,他繼續被拋給這個調用方法的調用者。這個過程會一直持續下去,直到異常被處理。這一個過程被稱爲捕獲異常;
  • 若是一個異常回到main()方法,而且main()也不處理,則程序運行終止;
  • 程序員一般只能處理Exception,而對Error無能爲力;
try{
    //須要判斷是否出現異常的語句
}catch(Exception e){
    //捕獲異常  
}finally{
    //不管是否出現異常,都會運行這裏的代碼
}

注意:若是有多個catch,在捕獲到前面的異常後,後面的就不會再捕獲了。

聲明拋出異常

  • 聲明拋出異常是java中處理異常的第二種方式;
  • 若是一個方法可能生成某種異常,可是並不能肯定如何處理這個異常,則此方法應顯示地聲明拋出異常,代表該方法將不對這些異常進行處理,由該方法的調用者進行處理。
  • 在方法中聲明throws子句能夠聲明拋出異常的列表,throws後面的異常類型能夠是方法中產生的異常類型,也能夠是它的父類;
  • 舉例:public void readFile(String file) throws FileNotFoundException{
                   FileInputStream fis = new FileInputStream(file);
               }
package myjava;

public class Test3 {
    public static void main(String[] args) {
        B b = new B();
        try {
            b.test();
        }catch(Exception e){
            e.printStackTrace();
        }                                
    }
}
class B{
    int i;
    public void test() throws Exception{
        B b = null;
        System.out.println(b.i);
    }
}

輸出:

 

注意:當父類方法拋出異常,子類方法繼承父類對該方法進行重寫時,也須要拋出異常,同時拋出的異常範圍不能比父類的大。

人工拋出異常:

  • java異常類對象除在程序執行的過程當中出現異常時由系統自動生成並拋出,也可根據人工建立並拋出;
  • 首先要生成異常類對象,而後經過throw語句實現拋出操做;
  • 能夠拋出的異常必須是throwable或其子類的實例;
package myjava;

public class Test3 {
    public static void main(String[] args) {
        B b = new B();
        try {
            b.test(200);
        }catch(Exception e){
            e.printStackTrace();
        }                                
    }
}
class B{
    int age;
    public void test(int age) throws Exception{
        if (age>=0 && age <= 100) {
            System.out.println("合法");
        }else {
            throw new Exception("年齡不合法");
        }
    }
    
}

輸出:

 

建立用戶自定義異常類:用戶自定義的異常類必須繼承現有的異常類

package myjava;

public class Test3 {
    public static void main(String[] args) {
        B b = new B();
        try {
            b.regist(-1);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
class B{
    
    public void regist(int num) throws Exception{
        if (num<0) {
            throw new MyException("人數不能爲負值",3);
        }else {
            System.out.println("登記人數"+num);
        }
    } 
}
class MyException extends Exception{
    private int idnumber;
    public MyException(String message,int id) {
        super(message);
        this.idnumber = id;
    }
    public int getId() {
        return idnumber;
    }
}

輸出:

 

而後就能夠拋出異常:

package myjava;

public class Test3 {
    public static void main(String[] args) {
        B b = new B();
        try {
            b.message();
        }catch(Exception e){
            e.printStackTrace();
        }
    } 
}
class B{
    public void regist(int num) throws Exception{
        if (num<0) {
            throw new MyException("人數不能爲負值",3);
        }else {
            System.out.println("登記人數"+num);
        }
    }
    public void message() throws Exception {
        try {
            regist(-1);
        }catch (MyException e){
            System.out.println("登記失敗,出錯種類"+e.getId());
        }
        System.out.println("本次登記結束");
    }
    
}
class MyException extends Exception{
    private int idnumber;
    public MyException(String message,int id) {
        super(message);
        this.idnumber = id;
    }
    public int getId() {
        return idnumber;
    }
}

輸出:

相關文章
相關標籤/搜索