java.lang.Throwable 異常/深入


有幾個現象是需要總結的: 
-------------------------------------- 
在java語言中,錯誤類的基類是java.lang.Error,異常類的基類是java.lang.Exception。 

相同點:java.lang.Error和java.lang.Exception都是java.lang.Throwable的子類,因此java.lang.Error和java.lang.Exception自身及其子類都可以作為throw的使用對象,如:throw new MyError();和throw new MyException();其中,MyError類是java.lang.Error的子類,MyException類是java.lang.Exception的子類。 

不同點:java.lang.Error自身及其子類不需要try-catch語句的支持,可在任何時候將返回方法,如下面的方法定義: 

public String myMethod() { 
throw new MyError(); 
} 

其中MyError類是java.lang.Error類的子類。 

java.lang.Exception自身及其子類需要try-catch語句的支持,如下的方法定義是錯誤的: 

public String myMethod() { 
throw new MyException(); 
} 

正確的方法定義如下: 

public String myMethod() throws MyException { 
throw new MyException(); 
} 

其中MyException類是java.lang.Exception的子類。 

---------------------------------------- 

1)如果代碼中有一個地方發生了異常, 也就是Throwable被new出來的那個地方,由於Throwable的構造函數中直接調用了fillInStackTrace(), 那么Throwable會一步一步地追蹤方法的調用,直到追蹤到線程的終端, 例如,main線程的main()方法,其他的線程的run()方法。 
2)fillInStackTrace是native方法,也只有native方法可以完成這樣的代碼追蹤。 
3)Throwable有一個方法setStackTrace()之外(注意到setStackTrace只是use by RPC frameworks and other advanced systems),也就是說setStackTrace()通常不會被應用程序用到。 
4)跟setStackTrace()相反,StackTrace中的信息可以通過調用fillInStackTrace()方法來獲得,此外還可以通過deserialize的方法來獲得;可以看看它的writeObject()方法。 
5)fillInStackTrace()方法返回的Throwable為this指針; 這樣可以很方便的使用throw ex.fillInStackTrace(); 

-------------------------------------------- 

異常是當JVM(JAVA虛擬機)在執行應用程序的某個方法的時候遇到的非正常現象,JVM就會生成一個異常對象,拋給客戶以便客戶進行異常處理.Struts框架的異常處理機制建立在java異常處理的基礎之上.在研究Struts異常處理之前,先回顧一下java異常處理原理,理解java虛擬機JVM的異常處理過程有助於應用設計正確的異常處理方法.處理異常需要JVM付出不小的開銷,所以用於必須慎重使用. 

JAVA異常是在java程序運行的時候遇到非正常的情況而創建的對象,它封裝了異常信息,java異常的根類為java.lang.Throwable,整個類有兩個直接子類java.lang.Error和java.lang.Exception.Error是程序本身無法恢復的嚴重錯誤.Exception則表示可以被程序捕獲並處理的異常錯誤.JVM用方法調用棧來跟蹤每個線程中一系列的方法調用過程,該棧保存了每個調用方法的本地信息.對於獨立的JAVA程序,可以一直到該程序的main方法.當一個新方法被調用的時候,JVM把描述該方法的棧結構置入棧頂,位於棧頂的方法為正確執行的方法.當一個JAVA方法正常執行完畢,JVM回從調用棧中彈處該方法的棧結構,然后繼續處理前一個方法.如果java方法在執行代碼的過程中拋出異常,JVM必須找到能捕獲異常的catch塊代碼.它首先查看當前方法是否賊這樣的catch代碼塊,如果存在就執行該catch代碼塊,否則JVM回調用棧中彈處該方法的棧結構,繼續到前一個方法中查找合適的catch代碼塊.最后如果JVM向上追到了main()方法,也就是一直把異常拋給了main()方法,仍然沒有找到該異常處理的代碼塊,該線程就會異常終止,如果該線程是主線程,應用程序也隨之終止,此時JVM將把異常直接拋給用戶,在用戶終端上會看到原始的異常信息.

 

本文轉自:http://nakata-yf.iteye.com/blog/23569


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM