2011-04-27 83 views
23

我可以看到一個例外,我可以打印e.getCause(),但它始終是null在java中設置異常原因

我是否需要將它設置在某個地方,或者是缺少的是將原因設置爲null?

回答

49

異常具有messagecause的屬性。信息是一種描述,或多或少地準確地告訴讀者,出了什麼問題。 cause是不同的:它是,如果可用,另一個(嵌套)Throwable。響應@djangofans評論 -

catch(IOException e) { 
    throw new ApplicationException("Failed on reading file soandso", e); 
    //       ^Message      ^Cause 
} 

編輯:

的概念,如果我們使用自定義異常喜歡這個經常被使用。

標準是嵌套表達式(原因)也是用它的堆棧跟蹤打印的。

運行這個小應用

public class Exceptions { 
    public static void main(String[] args) { 
     Exception r = new RuntimeException("Some message"); 
     throw new RuntimeException("Some other message", r); 
    } 
} 

將輸出

Exception in thread "main" java.lang.RuntimeException: Some other message 
    at Exceptions.main(Exceptions.java:4) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.RuntimeException: Some message 
    at Exceptions.main(Exceptions.java:3) 
    ... 5 more 

兩個消息都包括在內。

+0

是否有可能顯示一個異常,同時顯示額外原因的附加堆棧跟蹤?這不就是Vik真的在問什麼嗎?他並沒有問:顯示消息的原因,他問:顯示異常的原因。 – djangofan 2017-01-15 01:27:31

+0

@djangofan - 我在回答中添加了一些行。希望能幫助到你。 – 2017-01-16 21:46:43

2

class Exception has constructors that takes cause Throwable。您需要調用這些構造函數,或者爲調用這些超級構造函數的自定義異常類提供構造函數。

2

的getCause - 如果原因不存在或未知返回此拋出或空的原因。 (原因是導致此拋出對象拋出的對象。)

閱讀Java文檔:getCause