1. 程式人生 > >java程式設計入門4 異常處理

java程式設計入門4 異常處理

異常處理

異常的定義

1.異常是在程式碼序列執行時出現的非正常事件,是特殊的執行錯誤物件。異常的發生將阻止程式正常執行,並可能出現以下兩種情況。

1)程式執行終止,控制權返回給作業系統

2)程式執行終止,系統宕機崩潰狀態

異常類

1.java提供了以Throwable類為基類的一系列異常類和錯誤類。throwable有兩個直接的子類--Error(錯誤類)和Exception(異常類),Error類代表程式出現的錯誤,如程式執行時系統內部錯誤或資源耗盡等。這種錯誤是不能通過修改程式程式碼來恢復的。Exception類,代表程式出現的異常。

2.Exception類包括執行異常類(RuntimeException及其子類)和非執行異常類,執行異常類的產生一般由程式設計師的程式設計錯誤引起,完全可以通過改程序序避免,所以java編譯器對此類異常不進行檢查。非執行異常類是由執行環境引發的異常,eg:檔案讀寫錯誤,資料庫連線不通,找不到檔案等。所以java編譯器要求java程式必須捕捉或處理所有非執行異常。

常見的異常類

異常類 異常類描述 異常類別
ArithmeticException 算術錯誤 執行異常
ArrayOutOfBoundsException 陣列越界使用 執行異常
NullPointerException 引用空物件 執行異常
IllegalArgumentException 引數無效 執行異常
NumberFormatException 資料格式不對 執行異常
SecurityException 安全性錯誤 執行異常
ClassNotFoundException 未找到欲裝載的類 非執行異常
FileNotFoundException 未找到指定的檔案或目錄 非執行異常
IOException 輸入、輸出錯誤 非執行異常
InterruptedException 執行緒在睡眠、等待或其他原因暫停時被其他程序打斷 非執行異常

Throwable常見方法

方法宣告 功能描述
String getMessage() 輸出錯誤性質
String toString() 給出異常的型別與性質
void printStackTrace() 指出異常的型別、性質、棧層次及出現在程式中的位置並輸出至標準錯誤流
void printStackTrace(PrintStream s) 指出異常的型別、性質、棧層次及出現在程式中的位置並輸出至指定的輸出流

異常處理

1.java中異常處理是通過try……catch……fianlly語句來實現的,具體格式為:

try{
    可能丟擲異常的語句
}
catch(異常型別1 異常物件){
    對異常型別1物件的處理
}
catch(異常型別2 異常物件){
    對異常型別2物件的處理
}
…… …… ……
catch(異常型別n 異常物件){
    對異常型別n物件的處理
}
finally{
    不管是否出現異常,必須執行的語句
}

 

說明:

1)將有可能出現異常的程式碼用try-catch語句塊進行處理,當try語句塊中的程式碼執行出現異常時,則進入catch語句塊,從上至下依次與catch語句塊中的異常型別進行查詢匹配(檢查以丟擲的異常物件型別是否與該catch語句塊中指定的異常型別相同或為其子類)執行完catch程式碼塊中的程式程式碼後,將繼續執行catch程式碼塊後的其他程式碼,而不會執行try程式碼塊中發生異常語句後面的程式碼。

2)在異常處理中,最多有一個catch語句塊會被執行。另外,如果有多個catch語句塊,且catch語句塊中的引數所指定的異常型別有父子繼承關係,則要求處理子類異常的catch語句塊放在處理父類異常的catch語句塊的前面。否則會出現編譯錯誤。

3)由於finally語句塊中的程式碼肯定會被執行,所以通常在finally語句塊中進行資源的清除工作。

在方法中丟擲異常

1.若某個方法可能會發生異常,但不想在當前方法中處理這個異常,則可以使用throws、throw關鍵字在方法中丟擲異常。

使用throws關鍵字丟擲異常

1)throws關鍵字通常被應用在宣告方法時,用來指定方法可能丟擲的異常。多個異常可使用逗號分隔。

2)如果是Error、RuntimeException或它們的子類,可以不使用throws關鍵字來宣告要丟擲的異常,編譯仍能順利通過,但在執行時會被系統丟擲。

使用throw關鍵字丟擲異常

1)throw關鍵字通常用於方法體中,並且丟擲一個異常物件。程式在執行到throw語句時立即終止,它後面的語句都不執行。通過throw丟擲異常後,如果想在上一級程式碼中來捕獲並處理異常,則需要在丟擲異常的方法中使用throws關鍵字在方法的宣告中指定要丟擲的異常;如果要捕獲throw丟擲的異常,則必須使用try-catch語句塊。

2)throw通常用來丟擲使用者自定義異常。

自定義異常類

1.自定義異常類必須繼承Exception類或其子類

class MyException extends Exception{
    public MyException(String ErrorMessage) {
        super(ErrorMessage);
    }
}        

 

2.自定義異常的丟擲

1)自定義異常不可能依賴系統自動丟擲,因為系統不知道錯誤在哪裡,所以需在自定義的出錯位置藉助於throw語句丟擲自定義的異常類物件。用throw語句丟擲異常物件的語法格式為:

修飾符 返回型別 方法名(引數列表)throws 異常類名列表{
    …… …… ……
    throw 異常類物件
    …… …… ……
}

 

說明:

1)一般這種丟擲異常的語句應該被定義為在滿足一定條件時執行。

2)含有throw語句的方法。應該在方法頭定義中增加“throws 異常類名列表"。如果方法中的throw語句中不止一個,則在異常類名列表中一一列出,中間用逗號隔開。

public class Test {
    static int dev(int number1,int number2) throws MyException,IOException{
        if(number1<0||number2<0) {
            throw new MyException("不可以使用負數");
        }
        if(number1>100||number2>100) {
            throw new MyException("數值太大");
        }
        return number1/number2;
    }
    public static void main(String[] args) {
        try {
            int result=dev(10,0);
            System.out.println(result);
        }
        catch(MyException e) {
            e.printStackTrace();
        }
        catch(IOException e) { 
            e.printStackTrace();
        }
    }
}

 

異常使用原則

1.在當前方法宣告中使用try-catch語句捕獲異常

2.一個方法被覆蓋時,覆蓋它的方法必須丟擲相同的異常或異常的子類

3.如果父類丟擲多個異常,則覆蓋方法必須丟擲那些異常的一個子集,不能丟擲新異常

注:Error、RuntimeException或它們的子類,可以不使用throws關鍵字來宣告要丟擲的異常

//原則2
public class Text extends father{
    public void fun() throws ClassNotFoundException{

    }
    public static void main(String[] args) {

    }
}
class father {
    public void fun() throws IOException,ClassNotFoundException{

    }
}


//原則3
public class Text extends father{
    public void fun() throws ClassNotFoundException,FileNotFoundException{

    }

    public static void main(String[] args) {

    }
}
class father {
    public void fun() throws IOException,ClassNotFoundException{

    }
    public void fun1() throws FileNotFoundException{

    }
}

2018-11-25