java筆記--異常詳解與處理


一、異常概念

 

   Throwable類是Java中所有錯誤或異常的超類。


    1.只有當對象是此類(或其子類)的實例時,才能通過Java虛擬機或着Java throw語句拋出。
    2.只有此類或其子類才可以是catch字句中的參數類型。
    3.有兩個直接子類:Error和Exception
        Error--指應用程序不應該去處理捕獲的一種嚴重問題,常表示系統級的錯誤,如內存溢出
       Exception--指程序需要捕獲,需要處理的異常,是一種設計或實現方面的問題。
            Exception分為兩類:RuntimeException和CheckedException
               RuntimeException--運行時異常,由程序員錯誤導致,不需要捕獲處理,直接由
                            虛擬機接管,層層上拋,記錄日志,程序員應盡量避免此種異常。
                CheckedException--一般異常,需要進行catch,如IO異常和SQL異常等。
                
        注:Error是不需要程序員關心的,屬於系統級的錯誤
             RuntimeException需要程序員注意邏輯和編碼上的謹慎,盡量避免此種錯誤發生
             CheckedException需要進行捕獲處理
    

   
    --支持知識共享,轉載請標注地址"http://www.cnblogs.com/XHJT/p/3927577.html  "——和佑博客園,謝謝~~--    
   
二、常見的RuntimeException異常:

 

   1.ArithmeticException 算數異常--如最常見的除數為0
   
    2.ArrayindexOutOfBoundsException 數組下標越界異常,但需要遍歷數組時,用foreach或者ArraryList可避免此異常。
   
    3.ClassCastException 強制轉換異常
   
    4.ClassNotFoundException 找不到指定類異常,此類異常常發生於以下幾種情況,
                                          如:Class類中的forName方法
                                               ClassLoader類中的findSystemClass方法
                                               ClassLoader類中的loadClass方法
                               
    5.NullPointException 空指針異常,當應用程序試圖在需要對象的地方使用null時,拋出此異常:
                                  如:調用null對象的實例方法
                                       訪問或修改null對象的字段
                                       將null作為一個數組,獲得其長度
                                       將null作為一個數組,訪問或修改其元素值
                                       將null作為Throwable值拋出
                                  要避免此類異常可在定義引用類型變量就對其初始化,或者在使用此變量進行是否為空判斷。
   
    6.ArrayStoreException 數組存值異常--即元素類型不一致時拋出此異常,但若數組引用類型為Object則不會拋出此異常。
 

 
三、其他常見異常
   
   1.IllegalAccessExcetion 非法訪問異常--是當應用程序試圖反射性地創建一個實例(而不是數組)、設置或獲取一個字段,
                                       或者調用一個方法,但當前正在執行的方法無法訪問指定類、字段、方法或構造方法的定義時
                                       拋出的異常。
                                       此異常最常見是在有安全管理器下使用反射設置私有域的值。此時必須要使用setAccessible()修改
                                       其可見性。一般而言,盡量避免使用反射來訪問私有域。
                       
    2.FileNotFoundException 文件未發現異常--在試圖打開指定路徑名表示的文件失敗時拋出的異常。在不存在具有指定路徑
                                     名的文件時,該異常有FileInputStream、FileOutputStream和ReadomAccessFile構造方法拋出。
                                     若此文件存在,卻由於其他原因不可訪問,將拋出此異常。如打開一個只讀文件進行寫入。
                                     要避免此類異常,可先通過File類的exists()方法來判斷此文件是否存在。也可使用文件選擇器,把
                                     可操作的文件均羅列出來。
   
    3.SqlException 數據庫異常--提供關於數據庫訪問錯誤或其他錯誤信息的異常。通過此異常可知道:
                        a.描述錯誤的字符串;
                        b."SQLstate"字符串,該字符串遵守XOPEN SSQLstate約定或SQL:2003約定
                        c.特定於每個供應商的整數錯誤代碼。
                        d.到下一個Exception的鏈接
                        e.因果關系,可查出任何導致此SQLException的原因

 

 

四、對異常的處理

 

throw:
    使用throw關鍵字可以在方法體中拋出異常。該異常既可以使系統預定義異常,也可是用戶自定義異常;
    throw總是出現在函數體中,用來拋出一個具體異常。程序會在throw語句后立即終止,它后面的語句執
    行不到,然后在包含它的所有try塊中(可能在上層調用函數中)從里向外尋找含有與其匹配的catch子
    句的try塊:
   
        throw 異常對象;
        此時要拋出異常必須要應用在方法體中。

throws:
    使用throws關鍵字可能會拋出異常;該異常既可以使系統預定義異常,也可是用戶自定義異常;
    throws總是出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。對大多數Exception
    子類來說,Java 編譯器會強迫你聲明在一個成員函數中拋出的異常的類型。如果異常的類型是
    Error或 RuntimeException, 或它們的子類,這個規則不起作用, 因為這在程序的正常部分中
    是不期待出現的。 如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的
    類型。
   
        [<修飾符>]<返回值類型><方法名>([<參數列表>])[throws<異常類>]
       注:異常類可以聲明多個,用逗號分割。
   
   
throw和throws的區別:
    1.前者在方法體中使用,是一個語句,用於拋出具體的異常;后者在聲明方法時使用,是一個方法,用於聲明可能拋出的異常。
    2.前者不能單獨使用,要么和try-catch-finally配套,要么和throws配套;后者可單獨使用。
    3.使用前者,則一定會拋出異常,使用后者則可能會拋出異常
    4.程序會在throw語句后立即終止,它后面的語句執行不到,然后在包含它的所有try塊中(可能在上層調用函數中)從里向外尋
      找含有與其匹配的catch子句的try塊。   
     
為預定於異常添加提示信息:
   
    對於系統預定義的異常,一般而言至少有兩個構造函數,即有參構造和無參構造。程序員可以使用有參構造方法來添加提示 信息。


    代碼實例:

package com.xhj.exception;

/**
 * 為預定於異常添加提示信息:
 * 
 * @author XIEHEJUN
 * 
 */
public class AddExceptionMessage {

    public static void throwException() {
        throw new UnsupportedOperationException("沒有任何數據");
    }

    public static void main(String[] args) {
        try {
            AddExceptionMessage.throwException();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}

 

用戶自定義異常:


    雖然Java本身定義的異常類已經十分的豐富齊全,但是在實際應用當中,需求總是千變萬化的。
    當需求需要而Java預定義異常類中卻沒有時,編程人員可通過自定義異常類來滿足開發需求。
   
    要編寫一個自定義的異常類很簡單,只需要繼承Exception類或其子類,然后實現其構造方法即可。
       public class MyException extends Exception{}
       
   代碼實例:

package com.xhj.exception;

/**
 * 自定義異常
 * 
 * @author XIEHEJUN
 * 
 */
public class MyDefinedException extends Exception {

    public MyDefinedException(String message) {
        super(message);

    }

    public static void main(String[] args) throws MyDefinedException {
        
        String[] str = { "1", "2", "3", "4", "5", "6" };
        for (String string : str) {
            if (string.equals("6")) {
                throw new MyDefinedException("此數據不能大於其字節長度!");
            }
        }
        
    }

}

 

捕獲異常:

當遇到異常,我們一般有兩種解決方案:一種當然是將異常拋出;另外一種就是將異常捕獲
拋出異常是一個很簡單的行為,但是這個簡單的行為將會讓程序直接退出。而在實際需求當中,
並不是什么異常都能拋出的,因為不管怎么樣,我們總是要保持程序處於運行狀態的,不然也就沒有什么意義了。

    異常的捕獲要通過try--catch--finally語句塊來完成:


    1.try是不可缺少額語句塊,主要用來放置可能出現異常的語句;
    2.catch和finally兩者至少要有一個1個與try配套;
    3.catch塊是用來放置異常發生后的處理語句;
    4.finally里放置的則是無論發生異常與否都會執行的語句。
   
    注:對異常進行捕獲會占用很高的內存,因此try塊中的語句要盡量少。
   
   try--catch--finally的執行順序:
   
    實例代碼:

package com.xhj.exception;

/**
 * 認識try--catch--finally的執行順序
 * 
 * @author XIEHEJUN
 * 
 */
public class ExecuteExceptionShort {

    public static void main(String[] args) {
        String[] strs = new String[5];
        try {
            int i = strs.length;
            System.out.println("----進入try代碼塊----");
            System.out.println("String數組大小為:" + i);
            String str = "我是丑小鴨!";
            strs[5] = str;
            System.out.println("strs[5] = " + strs[5]);
            System.out.println("----離開try代碼塊----");
        } catch (Exception e) {
            System.out.println("----進入catch代碼塊----");
            System.out.println("異常為: " + e.toString());
            System.out.println("----離開catch代碼塊----");
        } finally {
            System.out.println("----進入finally代碼塊----");
            strs[4] = "我是美麗的白天鵝";
            System.out.println(strs[4]);
            System.out.println("----離開finally代碼塊----");
        }

    }

}


注:try--catch--finally語句塊可捕獲多個異常,但是在捕獲多個異常的時候一定要注多個catch的執行順序,
所要捕獲的異常一定要從小到大排列。當然也可直接通過所有異常的父類Exception,來簡單處理。


免責聲明!

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



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