Java異常中的異常鏈機制
阿新 • • 發佈:2018-12-05
一.異常鏈
- 常常會再捕獲一個異常後跑出另外一個異常,並且希望把異常原始資訊儲存下來,這被稱為異常鏈。
- 在JDK1.4以前,程式設計師必須自己編寫程式碼來儲存原始異常資訊,
- 現在所有Throwable的子類子構造器中都可以接受一個cause物件作為引數,這個cause就異常原由,代表著原始異常,即使在當前位置建立並丟擲行的異常,也可以通過這個cause追蹤到異常最初發生的位置。
- Throwable類及其所有的子類都提供了帶cause引數的構造器,其他的異常類就只有通過initCause()來設定cause了。
二.程式碼
- public class ExceptionCause {
- public static void main(String[] args) throws Exception {
- test1();
- }
-
- private static void test1() throws Exception{
- try{
- test2();
- }catch(NullPointerException ex){
- //1 Exception bussinessEx = new Exception("packag exception");
- // bussinessEx.initCause(ex);
- // throw bussinessEx;
- //2 throw new Exception("packag exception", ex);
- //3 throw (Exception)ex.fillInStackTrace().initCause(ex);
- }
- }
- private static void test2(){
- test3();
- }
- private static void test3(){
- throw new NullPointerException("str is null");
- }
- }
- 1和2分別通過initCause()和構造器設定cause。
- 3的出發點和1 2 一樣,當能否執行通過?答案是不能,參考http://zy19982004.iteye.com/admin/blogs/1974796 throwable 不能是它自己的 cause。
- 控制檯資訊
- Exception in thread "main" java.lang.Exception: packag exception
- at com.jyz.study.jdk.exception.ExceptionCause.test1(ExceptionCause.java:18)
- at com.jyz.study.jdk.exception.ExceptionCause.main(ExceptionCause.java:11)
- Caused by: java.lang.NullPointerException: str is null
- at com.jyz.study.jdk.exception.ExceptionCause.test3(ExceptionCause.java:31)
- at com.jyz.study.jdk.exception.ExceptionCause.test2(ExceptionCause.java:27)
- at com.jyz.study.jdk.exception.ExceptionCause.test1(ExceptionCause.java:16)
- ... 1 more
筆者開設了一個知乎live,詳細的介紹的JAVA從入門到精通該如何學,學什麼?
提供給想深入學習和提高JAVA能力的同學,歡迎收聽https://www.zhihu.com/lives/932192204248682496
提供給想深入學習和提高JAVA併發程式設計能力的同學,歡迎收聽https://www.zhihu.com/lives/1018219399903387648