java的異常一

寫java代碼,異常用的很多,但以前沒有系統的去研究過,今天正好面試被一道異常題搞倒了,回家就把異常看了下,補補基礎。
java中的異常類特別多,但我們關心只是以下類圖中的部分。
[b][size=large][color=brown]java異常類的體系層次結構[/color][/size][/b]
[img]http://chjl2020.iteye.com/upload/attachment/74253/7ef8fa47-9c03-338c-b32f-01c62c9b549c.jpg[/img]

從上圖可以看出,所有的java異常都是從Throwable類派生而來的,主要分成兩個分支,Error和Exception。
而Error體系描述的是java運行系統中的內部錯誤,出現這種異常,程序員基本是無能爲力的,Error體系並不是我們需要太多研究的對象。剩下的就是Exception體系。

從類圖中看,Exception體系也被分成兩個主要分支,分別是IOException體系和RunTimeException體系。
RunTimeException體系異常指的是人爲的編寫出不合理的代碼而導致的,
這些不合理的代碼包括一下情況:
1:錯誤的類型轉換。
2:數組越界訪問。
3:訪問空指針。
當出現以上情況的異常是,都說明是人爲的代碼問題,既然是人爲的異常,自然要人爲去避免。例如,

if(item < array.length)
{
System.out.println(t[item]);
}

我們事先判斷要訪問的元素是否超出了數組的長度,這樣就能避免因爲訪問越界的數組而發生ArrayIndexOutOfBoundsException異常。
以上的Error體系和RunTimeException體系在java異常中都被稱爲[color=red]未檢查異常[/color]。除了這兩個體系異常,其他異常都稱爲[color=red]已檢查異常[/color]

[b][color=brown][size=large]拋出異常[/size][/color][/b]
::當java中一個方法遇到自己無法處理的情況時,就應該拋出異常。

以下是java拋出一個異常的方法

public void fun_test()throws IOException
{
//....
throw new IOException();
}

通過先在方法名後面用[color=red]throws[/color]來聲明要拋出的異常,然後再在方法體內用
通過new IOException()創建異常對象,並用[color=red]throw[/color]把他拋出。當有多個異常時,就用“,”分割開:

public void fun_test()throws IOException,AlreadyBoundException
{
//....
throw new IOException();

//....
throw new AlreadyBoundException();

}


對於已經捕獲的異常,如果捕獲處理後還需要往上拋出的話,也可以用[color=red]throw[/color]關鍵字把他再出拋出,如

public void fun_test()throws IOException{
try{
//...
}catch(IOException e)
{
//..
throw e
}
}

上面代碼中雖然對IOException異常進行了捕獲,處理後在catch塊裏繼續把它往外拋.

[b][color=brown][size=large]捕獲異常[/size][/color][/b]
java是通過try/catch或try/atch/finally代碼快來捕獲異常的。
具體如下:

try{
//....
}catch(Exception e)
{
//....
}



try{
//.......
}catch(Exception e)
{
//.....
}finally{
//......
}


try代碼塊裏面拋出了異常,而這個異常又是catch裏指定的異常類型,則程序會停止執行try塊中剩下的代碼,並跳出try代碼塊。轉而執行catch塊裏面的代碼,
如果try裏沒有出現異常,則程序會直接忽略catch代碼塊,如果try的任何代碼出現異常,而這個異常又沒有在catch裏指定,則方法會立即退出。
注意::如果調用的方法聲明瞭會拋出異常,必須對它的異常進行處理,要麼通過try/catch捕獲它並處理,要麼聲明會拋出該異常,把異常繼續往上拋。
同樣,如果所負責的業務邏輯沒法對一個異常進行處理,最好就是把它往上拋,拋到有合適的地方再進行處理。

try/atch/finally
try/atch/finally代碼快是先執行try塊,如果try塊沒有異常,就接着執行finally塊,如果try出現異常,則停止並跳出try塊,轉而執行catch裏的代碼,再接着執行finally塊裏的代碼。
所以,不管try裏有沒有出現異常,finally塊裏的代碼是一定會被執行的。但有點要注意
看下面代碼:

public class ExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ExceptionTest.Exc());
}

public static String Exc()
{
try{
int i = 20/0;
}catch(Exception e)
{
System.out.println("出異常了");
return "返回catch";//在catch塊裏我們把函數return
}finally{
System.out.println("finally執行了");
}
return "正常返回";
}
}


打印的結果是:
[color=red]出異常了
finally執行了
返回catch[/color]

結果很明顯,雖然在catch有return語句,並且catch塊是比finally先執行的,但程序是先執行finally裏的代碼,再執行catch裏的return 語句返回的。
(今天面試遇到這題,我誤以爲是先catch裏的語句,因爲catch有return所以直接返回,不會執行finally了,怪自己基礎不紮實)。
(先寫到這,找時間繼續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章