我試着對異常普遍,默認情況下在我的應用程序中調用這個:NullPointerException:是否每個異常都包含原因?
String causeClass = e.getCause().getClass().getName();
但我發現了NullPointerException
秒。
是否有尋找原因,並得到事業異常的類名稱的安全的方式?
我試着對異常普遍,默認情況下在我的應用程序中調用這個:NullPointerException:是否每個異常都包含原因?
String causeClass = e.getCause().getClass().getName();
但我發現了NullPointerException
秒。
是否有尋找原因,並得到事業異常的類名稱的安全的方式?
由於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)
當你的結果顯示,一些Exception
S(有的Throwable
S IN一般)做不有其原因。正如docs說:
返回此拋出或空的原因,如果原因是 不存在或未知。 (原因是導致該 拋出對象拋出的對象。)
由於JG指出,printStackTrace()
是一個很好的選擇。
堆棧跟蹤比原因不同。如果您創建例外
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";
}
}