2011-04-27 82 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