2011-08-03 48 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"; 
    } 
} 
相關問題