Java異常學習筆記

1.異常處理機制

Java中將有可能會出現異常的代碼塊放到try{}中,當執行時try中的代碼真的出現異常,則系統會自動生成一個異常對象,該異常對象提交給Java運行環境,這個過程被稱爲拋出異常(throw).

當Java運行環境收到異常對象,會尋找該異常對象對應的catch塊,如果找到就進行處理,這個過程被稱爲捕獲異常。

如果沒有找到,則程序結束。

2.異常的繼承體系:

 

Java把所有的非正常情況分成兩種:異常(Exception)和錯誤(Error),他們都繼承Throwable父類。

    Error錯誤,一般是指與虛擬機相關的問題,如系統奔潰、虛擬機錯誤、動態鏈接失敗等,這種錯誤無法恢復或不可能捕獲,將導致應用程序中斷。通常應用程序無法處理這些錯誤,因此應用程序不應該試圖使用catch塊來捕獲Error對象。在定義該方法是也無須在其throws子句中聲明該方法可能拋出Error及其任何子類。這類異常主要是和硬件有關的,而不是由程序本身拋出的。

 

     Exception是Throwable的一個主要子類。Exception下面還有子類,其中一部分子類分別對應於Java程序運行時常常遇到的各種異常的處理,其中包括隱式異常。比如,程序中除數爲0引起的錯誤、數組下標越界錯誤等,這類異常也稱爲運行時異常,因爲它們雖然是由程序本身引起的異常,但不是程序主動拋出的,而是在程序運行中產生的。

一些主要子類對應的異常處理功能簡要說明如下:


    ArithmeticException——由於除數爲0引起的異常;

    ArrayStoreException——由於數組存儲空間不夠引起的異常;

    ClassCastException—一當把一個對象歸爲某個類,但實際上此對象並不是由這個類 創建的,也不是其子類創建的,則會引起異常;

    IllegalMonitorStateException——監控器狀態出錯引起的異常;

    NegativeArraySizeException—一數組長度是負數,則產生異常;

    NullPointerException—一程序試圖訪問一個空的數組中的元素或訪問空的對象中的 方法或變量時產生異常;

    OutofMemoryException——用new語句創建對象時,如系統無法爲其分配內存空 間則產生異常;

    SecurityException——由於訪問了不應訪問的指針,使安全性出問題而引起異常;

    IndexOutOfBoundsExcention——由於數組下標越界或字符串訪問越界引起異常;

    IOException——由於文件未找到、未打開或者I/O操作不能進行而引起異常;

    ClassNotFoundException——未找到指定名字的類或接口引起異常;

CloneNotSupportedException——一程序中的一個對象引用Object類的clone方法,但 此對象並沒有連接Cloneable接口,從而引起異常;

 

注意的是: 一定要先捕獲小異常,再捕獲大異常,否則,大異常子在前已經捕獲了,後邊的就不會執行,

<span style="font-size:18px;">public class ExceptionTest1 {
    public static void main(String[] args) {  
        try{  
            
            int  a = 0;
            int b = 1;
            int c = b/a;
            System.out.println(c);  
        }catch(ArithmeticException e){
        	System.out.println("first");
        }catch(Exception e){  
            System.out.println("second");  
        }  
    }   
}
 </span>


如果上述的兩個異常交換位置,則只會出現second

 

Java7提供了多異常捕獲,也就是說一個catch後邊可以有多個異常類型,但是用 | 隔開

 

<span style="font-size:18px;">public class ExceptionTest1 {
    public static void main(String[] args) {  
        try{  
            
            int  a = Integer.parseInt(args[0]);
            int  b = Integer.parseInt(args[1]);
            int c = a/b;
            System.out.println(c);  
        }catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException e){
        	System.out.println("first");
        	e = new ArithmeticException ("第一句");
        }catch(Exception e){  
            System.out.println("未知異常");  
            e = new RuntimeException ("第二句");
        }  
    }   
}</span>

則,第一句的位置會報錯,但是第二句正常

因爲捕獲多種異常時,異常變量使用隱式的final修飾,但是隻有一種變量時,沒有final修飾。


4.訪問異常信息


如果在程序中需要訪問異常對象的相關信息,則可以通過以下的方法,所有異常都包含了以下方法:

getMessage()  //返回該異常的詳細描述

printStackTrace()  //將該異常的跟蹤棧信息輸出到標準錯誤輸出

printStackTrace(PrintStream s)  //將該異常的跟蹤棧信息輸出到指定輸出流

getStractTRace()   //返回該異常的跟蹤棧信息

 

5.finally 用來回收資源

關於這塊當catch和finally同時又return時的返回結果見我上一篇博客

http://blog.csdn.net/dadaxiongdebaobao/article/details/52199959


6.總結

Ecxeption又分爲RuntimeException和checked異常,

對於checked異常,有兩種處理方法:

(1):如果方法知道該如何處理該異常,則在catch塊中處理。

(2):如果不知道怎麼處理,則在定義該方法時申明拋出異常。用throws


由於checked異常必須顯式捕獲或者拋出,所以建議使用runtimeException更簡單。因爲RuntimeException無需顯式申明。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章