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