一、異常概念
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,來簡單處理。