有幾個現象是需要總結的:
--------------------------------------
在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將把異常直接拋給用戶,在用戶終端上會看到原始的異常信息.