2011-08-03 18 views

回答

7

由于JustinKSU指出,有时候没有原因。从Throwable#getCause()

返回此抛出或空的原因,如果原因是 不存在或未知。 (原因是导致该 抛出对象抛出的对象。)

发生这种情况时,getCause()回报null,因此抛出一个NullPointerException当你调用getClass()。也许你可以使用它代替:

Throwable t = e.getClause(); 
String causeClass = t == null ? "Unknown" : t.getClass().getName(); 

然而,出于调试的目的,我觉得e.printStackTrace()要好得多。通过这种方式,您可以看到抛出异常的位置。下面是从printStackTrace()的典型输出:

java.lang.NullPointerException 
     at MyClass.mash(MyClass.java:9) 
     at MyClass.crunch(MyClass.java:6) 
     at MyClass.main(MyClass.java:3) 
0

当你的结果显示,一些Exception S(有的Throwable S IN一般)做有其原因。正如docs说:

返回此抛出或空的原因,如果原因是 不存在或未知。 (原因是导致该 抛出对象抛出的对象。)

由于JG指出,printStackTrace()是一个很好的选择。

1

堆栈跟踪比原因不同。如果您创建例外

new Exception("Something bad happened") 

没有任何原因。

但是,如果你创建传入另一个异常的异常,那么就会有一个原因。例如:

try { 
    //do stuff 
} catch (IOException ie) { 
    throw new Exception("That's not good", ie); 
} 

然后ie将是原因。

如果你正在试图确定哪些类抛出异常,你可以做这样的事情:

public static String getThrowingClass(Throwable t){ 
    StackTraceElement[] trace = t.getStackTrace(); 
    if(trace != null && trace.length > 0){ 
     return trace[0].getClassName(); 
    } else { 
     return "UnknownClass"; 
    } 
} 
相关问题