Как отследить исключение NullPointerException в цепочке получателей - PullRequest
24 голосов
/ 04 января 2009

Если я получаю исключение NullPointerException при таком вызове:

someObject.getSomething().getSomethingElse().
    getAnotherThing().getYetAnotherObject().getValue();

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

Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)

Мне довольно трудно определить, какой вызов на самом деле возвращает ноль, часто оказываясь рефакторингом кода примерно так:

Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();

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

Некоторые из вас могут утверждать, что конкатенирование геттеров - это плохой стиль, и его все равно следует избегать, но мой вопрос: могу ли я найти ошибку без изменения кода?

Подсказка: я использую eclipse и знаю, что такое отладчик, но не могу понять, как применить его к проблеме.

Мой вывод по ответам:
В некоторых ответах говорилось, что я не должен цеплять получатели один за другим, в некоторых ответах показано, как отлаживать код, если я не послушался этого совета.

Я принял ответ, который научил меня, когда нужно цеплять добытчиков:

  • Если они не могут вернуть ноль, соедините их так долго, как хотите. Не нужно проверять! = Null, не нужно беспокоиться об исключениях NullPointerExceptions ( предупреждаем, что цепочка все еще изменяет закон деметры, но я могу жить с этим )
  • Если они могут возвращать ноль, никогда, никогда, никогда не связывать их в цепочку и выполнять проверку на нулевые значения для каждого из них, которые могут возвращать ноль

Это делает любые полезные советы по фактической отладке бесполезными.

Ответы [ 11 ]

0 голосов
/ 04 января 2009

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

В eclipse (и большинстве IDE) вы также можете использовать выражения наблюдения для оценки кода, выполняемого в отладчике. Вы делаете это, выбирая код, и используете контекстное меню, чтобы добавить новые часы.

Если вы контролируете метод, который возвращает ноль, вы также можете рассмотреть шаблон Null Object, если ноль является допустимым значением для возврата.

...