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無需顯式申明。