Java學習(異常類)


一、什么是異常:

異常就是在運行時產生的問題。通常用Exception描述。

在java中,把異常封裝成了一個類,當出現問題時,就會創建異常類對象並拋出異常相關的信息(如詳細信息,名稱以及異常所處的位置)。

二、異常的繼承關系:

Throwable類是所有錯誤跟異常類的超類祖宗類)。

Exception異常類及其子類都是繼承自Throwable類,用來表示java中可能出現的異常,並且合理的處理這些異常。

RuntimeException類運行異常類,繼承自Exception類,它以及它的子類只能在運行過程中存在,當出現時,只能修改源代碼,此異常無法處理

Error類是與Exception的平級的類,用來表示Java中存在的嚴重錯誤,只能通過修改代碼來解決問題。

繼承體系的總結:

    Throwable: 它是所有錯誤與異常的超類(祖宗類)
        |- Error 錯誤
        |- Exception 編譯期異常,進行編譯JAVA程序時出現的問題
            |- RuntimeException 運行期異常, JAVA程序運行過程中出現的問題

三、異常與錯誤的區別:

 異常是指程序在編譯或者運行時出現的某種異常問題,我們可以對異常進行某種處理,如果不處理異常的話,程序將會停止運行。 

錯誤是指程序在運行時出現的嚴重問題,無法處理,程序將會停止運行,Error通常都是系統級別的問題,都是虛擬機jvm所在系統發生的,只能通過修改源代碼解決問題

四、異常產生的過程:

 1.運行或編譯時產生異常

2.創建異常類的對象

3.聲明異常類

4.將異常類對象傳給調用者(main()方法)處理

5.調用者無法處理,再將異常類對象傳給jvm虛擬機

6.jvm虛擬機將異常類的信息(名稱、詳細信息、異常所處的位置)打印在屏幕上,並且停止程序的運行

 

 五、拋出異常throw

 在java中,提供了一個throw關鍵字,用來拋出一個指定的異常

 使用方法:

1.創建一個異常對象。封裝一些提示信息

2.將這個異常告知調用者

 使用格式:

throw new 異常類名(參數);

 六、聲明異常throws

 聲明異常格式:

修飾符 返回值類型 方法名稱 (參數)throws 異常1名稱,異常2名稱{

}

七、捕獲異常try...catch...finally

捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理

 語句格式:

try {

     //需要被檢測的語句。

}

catch(異常類 變量) { //參數。

     //異常的處理語句。

}

finally {

     //一定會被執行的語句。

}

 

try該代碼塊中編寫可能產生異常的代碼。

catch用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。

finally有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。

捕獲異常的組合方式:

 1.  try catch finally組合:檢測異常,並傳遞給catch處理,並在finally中進行資源釋放。

 2.  try catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對異常進行捕獲處理。

 3.  一個try 多個catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對每種異常信息進行不同的捕獲處理。

注意:這種異常處理方式,要求多個catch中異常不能相同,並且catch中的多個異常之間有子父類異常的關系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。

4. try finally 組合: 對代碼進行異常檢測,檢測到異常后因為沒有catch,所以一樣會被默認jvm拋出。異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所有finally。只為關閉資源。

八、運行時期異常 RuntimeExecption

特點:

   方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常

    運行時期異常一旦發生,需要程序人員修改源代碼

九、異常在方法重寫中細節

1. 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。

class Fu {
    public void method () throws RuntimeException {
}
}
class Zi extends Fu {
    public void method() throws RuntimeException { }  //拋出父類一樣的異常
    //public void method() throws NullPointerException{ } //拋出父類子異常
}

 

2.當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集

class Fu {
    public void method () throws NullPointerException, ClassCastException{
}
}
class Zi extends Fu {
    public void method()throws NullPointerException, ClassCastException { }          
public
void method() throws NullPointerException{ } //拋出父類異常中的一部分 public void method() throws ClassCastException { } //拋出父類異常中的一部分 }

 

3.當被覆蓋的方法沒有異常聲明時,子類覆蓋時無法聲明異常的。

class Fu {
    public void method (){
}
}
class Zi extends Fu {
    public void method() throws Exception { }//錯誤的方式
}

十、異常中常用方法

在Throwable類中為我們提供了很多操作異常對象的方法,常用的如下:

1.getMessage方法:返回該異常的詳細信息字符串,即異常提示信息

2. toString方法:返回該異常的名稱與詳細信息字符串

3. printStackTrace:在控制台輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置

十一、自定義類異常

格式:

Class 異常名 extends Exception{ //或繼承RuntimeException
    public 異常名(){
}
    public 異常名(String s){ 
super(s); 
}
}

 

自定義異常繼承Exception演示:

class MyException extends Exception{
    /*
    為什么要定義構造函數,因為看到Java中的異常描述類中有提供對異常對象的初始化方法。
    */
    public MyException(){
        super();
    }
    public MyException(String message)    {
        super(message);// 如果自定義異常需要異常信息,可以通過調用父類的帶有字符串參數的構造函數即可。
    }
}

自定義異常繼承RuntimeException演示:

class MyException extends RuntimeException{
    /*
    為什么要定義構造函數,因為看到Java中的異常描述類中有提供對異常對象的初始化方法。
    */
    MyException(){
        super();
    }
    MyException(String message)    {
        super(message);// 如果自定義異常需要異常信息,可以通過調用父類的帶有字符串參數的構造函數即可。
    }
}

 

 實例代碼:

throw,throws,try/catch的使用

package com.oracle.Demo01;

public class Demo01 {
//try/catch格式:    用來處理異常
//        try{
//            被檢測的代碼(可能出現異常的代碼)
//        }catch(異常類名  變量){
//            異常的處理方式
//        }finally{
//            必須要執行的代碼
//        }
    public static void main(String[] args) {
        int[] arr={1,2,3};
        try{
            int res=getArray(arr);
            System.out.println(res);
        }catch(ArrayIndexOutOfBoundsException ex1){  //多catch處理時,平級的沒有先后順序
            System.out.println(ex1);    //當出現父子類關系式,一定要將子類的放在前面
            System.out.println("===========");
            System.out.println(ex1.getMessage());
            System.out.println("===========");
            System.out.println(ex1.toString());
            
        }catch(NullPointerException ex2){
            System.out.println(ex2);
            System.out.println(ex2.getMessage());
            System.out.println("===========");
            ex2.toString();
        }finally{
            System.out.println("必須要執行的代碼");
        }
        
        System.out.println("我執行了嗎");
    }
    //throw跟throws的區別     用來報告異常
    //throw 關鍵字后面,必須跟異常對象
    // throws 關鍵字后面,必須跟異常類名    用來將異常傳給調用者
    public static int getArray(int[] arr) throws ArrayIndexOutOfBoundsException,NullPointerException{
        if(arr==null){
            throw new NullPointerException("數組為空o(╯□╰)o");
        }
        if(arr.length<4){
            throw new ArrayIndexOutOfBoundsException("數組長度不夠(キ`゚Д゚´)!!");
        }
        int i=arr[3]*2;
        System.out.println("aaa");
        return i;
    }

}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM