NullPointerException:每个异常都不包含原因吗?

时间:2011-08-03 20:09:03

标签: java exception-handling nullpointerexception

我已尝试在普遍使用的情况下调用此异常,默认情况下在整个应用程序中调用它:

String causeClass = e.getCause().getClass().getName();

但我得到NullPointerException s。

是否有一种安全的方法来查找原因并获取原因异常的类名?

3 个答案:

答案 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()是一个很好的选择。