Posted on 2005-10-13 14:15
-=Kinohl=- 閱讀(563)
評論(0) 編輯 收藏 所屬分類:
編程語言
Java異常處理機(jī)制
keywords:
Exception,Method Inovation Stack,
難度:初學(xué),易
異常類的繼承
Java異常是java程序運(yùn)行時遇到非正常情況而創(chuàng)建的一種對象,她包裝了異常的信息。
Java異常的頂級類就是java.lang.Throwable。其結(jié)構(gòu)如下:





其中
Error ---- JVM的錯誤,也就是程序本身無法恢復(fù)的嚴(yán)重錯誤。
Exception--被程序捕獲并處理的異常。
JVM的方法調(diào)用堆棧
大家對于Debug都很喜歡,因?yàn)槊慨?dāng)有異常出現(xiàn)的時候,她會告訴你哪里出了異常調(diào)用到底是什么。這又是如何實(shí)現(xiàn)的?
在JVM中使用了Method Inovation Stack機(jī)制來跟蹤每一個線程中一系列的方法調(diào)用過程。并保存在Stack里邊。
Stack的頂端也就是當(dāng)前正在處理的方法。在Debug的時候,JVM會暫停被debug的線程,克隆她的Stack,然后顯示出來供
developer操作,這一點(diǎn)用Eclipse的人很有體驗(yàn)吧。
一旦異常發(fā)生,JVM首先從當(dāng)前的方法開始尋找處理的try/Catch,找不到,就回朔到stack的下一個,也就是parent調(diào)用
方法。舉例如下:

public void child(int a)throws UserException
{
if (a < 0)
throw new UserException();
}
父方法如下:

public void parent(int a)
{

try
{
a = 1;
method(a);//throw Exception

}catch(UserException ue)
{
System.out.println("I get it from Child")!
ue.printExceptionStack();
}
}
就這樣,異常被抓住了。當(dāng)然,如果在child方法里邊就捕獲,parent就不用這么“累”了。
其實(shí)最累的還是JVM,她要對異常捕獲進(jìn)行查找,如果一直都找不到,就把異常直接拋給用戶,那么在終端上就能看
到了。如果是拋出異常的程序是主程,還沒有被捕獲,那就“死翹翹”了。要注意!
異常處理對性能的影響
從上邊的原理就能知道,不捕捉異常、捕捉異常的位置不合適、都會導(dǎo)致JVM性能降低。
(PS:先記到這里,繼續(xù)上班。)