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

1、異常概念html

 

   Throwable類是Java中全部錯誤或異常的超類。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  "——和佑博客園,謝謝~~--    
   
2、常見的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則不會拋出此異常。
  編程

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

 

 

4、對異常的處理安全

 

throw:
    使用throw關鍵字能夠在方法體中拋出異常。該異常既可使系統預約義異常,也但是用戶自定義異常;
    throw老是出如今函數體中,用來拋出一個具體異常。程序會在throw語句後當即終止,它後面的語句執
    行不到,而後在包含它的全部try塊中(可能在上層調用函數中)從裏向外尋找含有與其匹配的catch子
    句的try塊:
   
        throw 異常對象;
        此時要拋出異常必需要應用在方法體中。
dom

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,來簡單處理。

相關文章
相關標籤/搜索