天天看點

java常見異常類筆記_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塊。

為預定于異常添加提示資訊:

對于系統預定義的異常,一般而言至少有兩個構造函數,即有參構造和無參構造。程式員可以使用有參構造方法來添加提示 資訊。

代碼執行個體:

packagecom.xhj.exception;

public classAddExceptionMessage {public static voidthrowException() {throw new UnsupportedOperationException("沒有任何資料");

}public static voidmain(String[] args) {try{

AddExceptionMessage.throwException();

}catch(Exception e) {

System.out.println(e.getMessage());

}

}

}

使用者自定義異常:

雖然Java本身定義的異常類已經十分的豐富齊全,但是在實際應用當中,需求總是千變萬化的。

當需求需要而Java預定義異常類中卻沒有時,程式設計人員可通過自定義異常類來滿足開發需求。

要編寫一個自定義的異常類很簡單,隻需要繼承Exception類或其子類,然後實作其構造方法即可。

public class MyException extends Exception{}

代碼執行個體:

packagecom.xhj.exception;

public class MyDefinedException extendsException {publicMyDefinedException(String message) {super(message);

}public static void main(String[] args) throwsMyDefinedException {

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的執行順序:

執行個體代碼:

packagecom.xhj.exception;

public classExecuteExceptionShort {public static voidmain(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,來簡單處理。