исключение пружинного упора в эксплуатации

Я реализую приложение Spring Rest как многомодульный проект maven. контроллеры в сети, сервисе и дао как слои.

У меня возникают проблемы с поиском точной причины и трассировки стека для любого исключения на уровне обслуживания. Я не использую блок try catch в методах обслуживания. Вместо этого я просто генерирую исключение. Теперь, когда возникает исключение нулевого указателя, глобальный обработчик исключений находит исключение. Он говорит null, но не обеспечивает трассировку стека.

Нужно ли мне использовать блоки try catch? Если да, у меня будут эти блоки во всех методах обслуживания.

Любые предложения приветствуются.


person user3930151    schedule 11.09.2016    source источник
comment
Покажите свой глобальный обработчик исключений. Я предполагаю, что вы не показываете там трассировку стека, если она не отображается.   -  person Kayaman    schedule 11.09.2016
comment
@ExceptionHandler ({Exception.class}) @ResponseBody public ResponseEntity ‹?› HandleAnyException (Exception e) {logger.error (Error: + e.getMessage ()); logger.error (Ошибка [причина]: + e.getCause ()); }   -  person user3930151    schedule 12.09.2016
comment
Еще кое-что. Вызывается исключение цели вызова. Я тоже не нахожу там трассировку стека.   -  person user3930151    schedule 12.09.2016
comment
Вы просто пытаетесь найти причину появления нулевого указателя? А пока почему бы вам просто не удалить обработчик исключений, а затем просмотреть полную трассировку стека? Также обычно бросают / ловят нулевые указатели в плохой практике программирования. Вы должны программировать защитно и выдавать определенные ошибки времени выполнения в случае непредвиденных значений NULL.   -  person Pete    schedule 12.09.2016


Ответы (2)


Ваш обработчик исключений не отображает трассировку стека, потому что вы этого не говорите. Ваш код плохой и неработающий.

logger.error("Error: " + e.getMessage());
logger.error("Error [cause]: " + e.getCause());

Использование getMessage(), чтобы узнать, какое исключение у вас возникло, бесполезно. NullPointerException возвращает в качестве своего сообщения String "null", что ни разу не поможет вам решить проблемы. Регистрация такой причины вызовет toString() метод cause, который тоже не поможет.

Единственный способ справиться с исключениями:

logger.error("Error", e);

Это будет правильно регистрировать трассировку стека, включая любые причины (ваш код даже не учел, что причина также может иметь причину). Вы можете использовать собственное сообщение вместо «Ошибка», но это не имеет особого значения.

person Kayaman    schedule 12.09.2016
comment
Я так и не понял, что есть разница между нижеприведенными. logger.error (Ошибка: + e); logger.error (Ошибка:, e); Конкатенация строк не работает, что было в моем случае. Спасибо. - person user3930151; 12.09.2016

Вы можете использовать @ExceptionHandler. Здесь вы найдете несколько примеров и увидите, что это не нужно чтобы изменить ваш текущий код. Не забудьте использовать Logger или поместить System.out.printLn (), чтобы увидеть трассировку стека исключения. Также, возможно, вам придется отладить свой метод, чтобы увидеть, что параметр или метод имеет нулевое значение.

person Diego Rojas    schedule 11.09.2016
comment
я делаю то, что упомянуто в примере. Я считаю, что getcause является исключением с нулевым указателем. когда я регистрирую сообщение, оно говорит, что просто null без другой информации. в затмении, если я проверяю, getcause имеет бесконечное количество getcause. - person user3930151; 12.09.2016
comment
мммм, возможно, вы используете e.getMessage (), вместо него вам нужно поместить e.printStackTrace () или напечатать просто e like object, это напечатает исключение с именами классов и методами, которые его генерируют. - person Diego Rojas; 12.09.2016
comment
Поместите это в свой код: {logger.error (Error:, e); } - person Diego Rojas; 12.09.2016
comment
Конкатенация строк была проблемой с моей стороны. Мне пришлось использовать запятую. Спасибо за вклад. - person user3930151; 12.09.2016