Если я получаю исключение 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 ( предупреждаем, что цепочка все еще изменяет закон деметры, но я могу жить с этим )
- Если они могут возвращать ноль, никогда, никогда, никогда не связывать их в цепочку и выполнять проверку на нулевые значения для каждого из них, которые могут возвращать ноль
Это делает любые полезные советы по фактической отладке бесполезными.