2015-09-17 4 views
1

Я улавливаю различные исключения в моем методе.Добавить сообщение в существующее NullPointerException

Если исключение составляет NullPointerException, я хотел бы добавить сообщение в существующее исключение.

Есть ли способ добавить сообщение в существующее исключение NullPointerException? Я не могу просто создать новое исключение, потому что мне нужно трассировку стека и т.д.

Моя идея состояла в том, чтобы просто создать новый Exception подобное:

new Exception("the message", myNullPointer); 

Но тогда, вывод не так как я это нужно, потому что таким образом, мой StackTrace выглядит следующим образом:

java.lang.Exception: 
...bla 
...bla 

Но мне нужно, чтобы держать NullPointerException так:

java.lang.NullPointerException: 
...bla 
...bla 

Также важно сказать, что у меня нет доступа к той части, где создан исходный NullPointer. Поэтому я не могу добавить сообщение при запуске.

Редактировать: Я знаю, что должен избегать NPE. Но я должен влиять на брошенный NPE. Поэтому я должен отреагировать.

+0

Co поправьте меня, если я ошибаюсь, но разве это не хорошая идея, чтобы убедиться, что нет NPE, выполнив простую нулевую проверку ... –

+0

Оберните ее. RuntimeException хорош для этого - не проверяется и имеет исключение причины в конструкторе. Разверните его с помощью getCause() позже. –

ответ

3

Как было отмечено в комментариях это не может быть хорошей идеей (особенно потому, что нулевое исключение может возникнуть из какой-то ситуации, вы не ожидали.

Тем не менее вы можете делать то, что вы хотите, как это

try { 
    ..potentiall throws exceptions... 
} catch (Exception e) { 
    RuntimeException re = new RuntimeException(e); 
    re.setStackTrace(e.getStackTrace()); 
    throw re; 
} 
+0

Спасибо. Мне пришлось внести некоторые изменения, но ваш ответ помог мне решить мою проблему. Я только что создал новый NPE с сообщением и добавил stacktrace из существующего NPE к вновь созданному. – Christian

0

Я уверен, передавая исходное исключение в конструкторе, как вы предлагаете, это лучшее, что вы можете сделать. При желании вы можете использовать .getCause(), чтобы определить причину исключения. Таким образом, вы можете создать более значимый результат для себя, например. регистрируя его вручную.

0

Что вам нужно позвонить getCause(), чтобы получить ваш NPE

String nullString = null; 
try { 
    nullString.split("/"); 
} catch (NullPointerException e) { 
    Exception ex = new Exception("Encapsulated", e); 

    System.out.println("Direct Stacktrace"); 
    ex.printStackTrace(); 

    System.out.println("With getCause"); 
    ex.getCause().printStackTrace(); 
} 
0

Я надеюсь, что вы смотрите на это:

public class NPException extends RuntimeException{ 

    public NPException(String message, Throwable exception){ 
     super(message, exception); 
    } 

} 

затем попробуйте:

throw new NPException("TEsting..", new NullPointerException().getCause()); 

даст вам что-то вроде:

Исключение в потоке "главный" NPException: ТЕСТИРОВАНИЕ .. в Test.main (Test.java : 151) at sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод)