java.lang.Throwable 異常/深入

來源:互聯網
上載者:User

標籤:

有幾個現象是需要總結的: 
-------------------------------------- 
在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

java.lang.Throwable 異常/深入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.