Java中編寫代碼出現異常,如何拋出異常,如何捕獲異常


異常的產生過程解析

  先運行下面的程序,程序會產生一個數組索引越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產生的過程。

工具類

class ArrayTools{ //對給定的數組通過給定的角標獲取元素。

public static int getElement(int[] arr,int index) { int element = arr[index]; return element; } }

測試類

class ExceptionDemo2 {   public static void main(String[] args) {     int[] arr = {34,12,67};     int num = ArrayTools.getElement(arr,4)     System.out.println("num="+num);     System.out.println("over");   } }

上述代碼執行過程圖解:

 

 

拋出異常throw

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

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

 

  2,需要將這個異常對象告知給調用者。throw 異常對象;

 

  throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。

//使用格式:
throw new 異常類名(參數); //例如:
throw new NullPointerException("要訪問的arr數組不存在"); throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出范圍");

聲明異常throws

  聲明:將問題標識出來,報告給調用者。如果方法內通過throw拋出了編譯時異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明,讓調用者去處理。

  聲明異常格式:

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

  聲明異常的代碼演示:

class Demo{ /* 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws關鍵字進行聲明。 */
    public void show(int x)throws Exception { if(x>0){ throw new Exception(); } else { System.out.println("show run"); } } } class Demo{ /* 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws關鍵字進行聲明。 */
    public void show(int x)throws Exception { if(x>0){ throw new Exception(); } else { System.out.println("show run"); } } }

  throws用於進行異常類的聲明,若該方法可能有多種異常情況產生,那么在throws后面可以寫多個異常類,用逗號隔開。

//多個異常的情況,例如:
public static int getElement(int[] arr,int index) throws NullPointerException, ArrayIndexOutOfBoundsException { if(arr==null){ throw new NullPointerException("arr指向的數組不存在"); } if(index<0 || index>=arr.length){ throw new ArrayIndexOutOfBoundsException("錯誤的角標,"+index+"索引在數組中不存在"); } int element = arr[index]; return element; }

捕獲異常try…catch…finally

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

  捕獲異常格式:

try { //需要被檢測的語句。
} catch(異常類 變量) { //參數。 //異常的處理語句。
} finally { //一定會被執行的語句。
}

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

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

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

class ExceptionDemo{ public static void main(String[] args){ //throws ArrayIndexOutOfBoundsException
        try { int[] arr = new int[3]; System.out.println( arr[5] );// 會拋出ArrayIndexOutOfBoundsException
 當產生異常時,必須有處理方式。要么捕獲,要么聲明。 } catch (ArrayIndexOutOfBoundsException e) { //括號中需要定義什么呢?try中拋出的是什么異常,在括號中就定義什么異常類型。 
            System.out.println("異常發生了"); } finally { arr = null; //把數組指向null,通過垃圾回收器,進行內存垃圾的清除
} System.out.println("程序運行結果"); } }

try…catch…finally異常處理的組合方式

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

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

void show(){ //不用throws 
    try{ throw new Exception();//產生異常,直接捕獲處理
    }catch(Exception e){ //處理方式 
 } }

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

void show(){ //不用throws 
    try{ throw new Exception();//產生異常,直接捕獲處理
    }catch(XxxException e){ //處理方式 
    }catch(YyyException e){ //處理方式 
    }catch(ZzzException e){ //處理方式 
 } }

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

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

void show(){//需要throws 
    try{ throw new Exception(); }finally { //釋放資源
 } }

 


免責聲明!

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



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