我已尝试在普遍使用的情况下调用此异常,默认情况下在整个应用程序中调用它:
String causeClass = e.getCause().getClass().getName();
但我得到NullPointerException
s。
是否有一种安全的方法来查找原因并获取原因异常的类名?
答案 0 :(得分:7)
JustinKSU指出,有时没有理由。来自Throwable#getCause()
:
返回此throwable的原因,如果原因是null,则返回null 不存在或未知。 (原因是造成这种情况的抛弃物 扔掉扔掉。)
发生这种情况时,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)
答案 1 :(得分: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";
}
}
答案 2 :(得分:0)
正如您的结果所示,某些Exception
(以及一些Throwable
一般)不有原因。如docs中所述:
返回此throwable的原因,如果原因是null,则返回null 不存在或未知。 (原因是造成这种情况的抛弃物 扔掉扔掉。)
正如JG所指出的那样,printStackTrace()
是一个很好的选择。