1. 程式人生 > >java異常之執行時異常和非執行時異常

java異常之執行時異常和非執行時異常

RuntimeException

RunntimeException的子類:
ClassCastException
多型中,可以使用Instanceof 判斷,進行規避
ArithmeticException
進行if判斷,如果除數為0,進行return
NullPointerException
進行if判斷,是否為null
ArrayIndexOutOfBoundsException
使用陣列length屬性,避免越界
這些異常時可以通過程式設計師的良好程式設計習慣進行避免的
1:遇到執行時異常無需進行處理,直接找到出現問題的程式碼,進行規避。
2:就像人上火一樣牙疼一樣,找到原因,自行解決即可
3:該種異常編譯器不會檢查程式設計師是否處理該異常
4:如果是執行時異常,那麼沒有必要在函式上進行宣告。
6:案例
1:除法運算功能(div(int x,int y))
2:if判斷如果除數為0,throw new ArithmeticException();
3:函式宣告throws ArithmeticException
4:main方法呼叫div,不進行處理
5:編譯通過,執行正常
6:如果除數為0,報異常,程式停止。
7:如果是執行時異常,那麼沒有必要在函式上進行宣告。
1:Object類中的wait()方法,內部throw了2個異常 IllegalMonitorStateException InterruptedException
1:只聲明瞭一個(throws) IllegalMonitorStateException是執行是異常沒有宣告。

class Demo12 {

    public static void main(String[] args){
        div(2, 1);
    }

    public static void div(int x, int y) {
        if (y == 0) {
            throw new ArithmeticException();  
        }
        System.out.println(x / y);
    }
}

非執行時異常(受檢異常)

如果出現了非執行時異常必須進行處理throw或者try{}catch(){}處理,否則編譯器報錯。
1;IOException 使用要匯入包import java.io.IOException;
2:ClassNotFoundException
2;例如人食物中毒,必須進行處理,要去醫院進行處理。
3:案例
1:定義一測試方法丟擲並宣告ClassNotFoundException(test())
2:main方法呼叫test
3:編譯報錯
1:未報告的異常 java.lang.ClassNotFoundException;必須對其進行捕捉或宣告以便丟擲

public void isFile(String path){
        try
        {
            /*
            根據檔案的路徑生成一個檔案物件,如果根據該路徑找不到相應的檔案,
            則沒法生成檔案物件。
            */
            File file = new File(path);
            //讀取檔案的輸入流
            FileInputStream input = new FileInputStream(file);
            //讀取檔案
            input.read();
        }
        catch
(NullPointerException e) { System.out.println("讀取預設的檔案路徑.."); } }

4:Sun 的API文件中的函式上宣告異常,那麼該異常是非執行是異常,
呼叫者必須處理。
5:自定義異常一般情況下宣告為非執行時異常
2:函式的重寫和異常
1:執行時異常
1:案例定義Father類,定義功能丟擲執行是異常,例如(test() throw
ClassCastException)
2:定義Son類,繼承Father類,定義test方法,沒有宣告異常
3:使用多型建立子類物件,呼叫test方法
4:執行子類方法
1:函式發生了重寫,因為是執行時異常,在父類的test方法中,可以宣告throws 也可以不宣告throws

class Father {
    void test() throws ClassCastException { // 執行時異常
        System.out.println("父類");
        throw new ClassCastException();
    }
}

class Son extends Father {
    void test() {
        System.out.println("子類");
    }
}
class Demo14 {

    public static void main(String[] args) {
        Father f = new Son();
        f.test();
    }
}

2:非執行時異常
1:定義父類的test2方法,丟擲非執行時異常,例如丟擲ClassNotFoundException
1:此時父類test2方法必須宣告異常,因為是非執行時異常
2:Son類定義test2 方法,丟擲和父類一樣的異常,宣告異常
3:使用多型建立子類物件,呼叫test方法,呼叫test2方法,
1:宣告非執行時異常的方法,在呼叫時需要處理,所以在main方法呼叫時throws
2:實現了重寫,執行子類的test2方法
3:總結子類重寫父類方法可以丟擲和父類一樣的異常,或
者不丟擲異常。

2:非執行時異常
1:定義父類的test2方法,丟擲非執行時異常,例如丟擲ClassNotFoundException
                1:此時父類test2方法必須宣告異常,因為是非執行時異常
                2:Son類定義test2 方法,丟擲和父類一樣的異常,宣告異常
                3:使用多型建立子類物件,呼叫test方法,呼叫test2方法,
1:宣告非執行時異常的方法,在呼叫時需要處理,所以在main方法呼叫時throws 
                    2:實現了重寫,執行子類的test2方法
            3:總結子類重寫父類方法可以丟擲和父類一樣的異常,或
者不丟擲異常。

4:子類丟擲並宣告比父類大的異常例如子類test2方法丟擲Exception
1:編譯失敗,無法覆蓋
2:子類不能丟擲父類異常的父類。
3:總結子類不能丟擲比父類的異常更大的異常。

//2:子類覆蓋父類方法不能比父類丟擲更大異常
class Father {
    void test() throws Exception {
        // 非執行時異常
        System.out.println("父類");
        throw new Exception();
    }
}

class Son extends Father {
    void test() throws ClassNotFoundException { // 非執行時異常
        System.out.println("子類");
        throw new ClassNotFoundException();
    }
}
class Demo14 {

    public static void main(String[] args) throws Exception {
        Father f = new Son();
        f.test();

    }
}

總結

            1:子類覆蓋父類方法是,父類方法丟擲異常,子類的覆蓋方法可以不拋

出異常,或者丟擲父類方法的異常,或者該父類方法異常的子類。
2:父類方法丟擲了多個異常,子類覆蓋方法時,只能丟擲父類異常的子

3:父類沒有丟擲異常子類不可丟擲異常
1:子類發生非執行時異常,需要進行try{}catch的(){}處理,不能
丟擲。
4:子類不能比父類丟擲更多的異常