我试着对异常普遍,默认情况下在我的应用程序中调用这个: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";
}
}