NullPointerException: не каждое исключение содержит причину? - PullRequest
5 голосов
/ 04 августа 2011

Я пытался вызывать это для исключений универсально и по умолчанию во всем приложении:

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

Но я получаю NullPointerException с.

Существует ли безопасный способ поиска причины и получения имени класса исключительной причины?

Ответы [ 3 ]

7 голосов
/ 04 августа 2011

Как указал ДжастинКСУ, иногда нет причин.От Throwable#getCause():

Возвращает причину этого броска или ноль, если причина не существует или неизвестна.(Причина заключается в том, что throwable вызвал бросание этого броска.)

Когда это происходит, getCause() возвращает null, поэтому при вызове getClass() выдается NullPointerException.Возможно, вы можете использовать это вместо:

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 голос
/ 04 августа 2011

Трассировка стека отличается от причины. Если вы создаете исключение

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";
    }
}
0 голосов
/ 04 августа 2011

Как показывает ваш результат, некоторые Exception с (и некоторые Throwable с в целом) не имеют причину.Как указано в документах :

Возвращает причину этого броска или ноль, если причина не существует или неизвестна.(Причина в том, что метание, из-за которого этот бросок был брошен.)

Как указывает JG, printStackTrace() - хорошая альтернатива.

...