Если я получаю исключение NullPointerException в вызове типа:
someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();
Я получаю довольно бесполезный текст исключения, например:
Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
Мне довольно сложно узнать, что на самом деле вызывает refurend null, часто обнаруживая, что рефакторинг кода происходит примерно так:
Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
а затем ждет более описательное исключение NullPointerException, которое сообщает мне, какую строку искать.
Некоторые из вас могут утверждать, что конкатентные геттеры - это плохой стиль, и его следует избегать в любом случае, но мой вопрос: могу ли я найти ошибку без изменения кода?
Подсказка: я использую eclipse, и я знаю, что такое отладчик, но я не могу понять, как применить его к проблеме.
Мой вывод по ответам:
Некоторые ответы сказали мне, что я не должен цепляться за геттеры один за другим, некоторые ответы показали, как отлаживать мой код, если я не знаю этого совета.
Я согласился с ответом, который научил меня, когда цепочки getters:
- Если они не могут вернуть null, соедините их так долго, как вам нравится. Нет необходимости проверять!= Null, не нужно беспокоиться о NullPointerExceptions (предупреждаем, что цепочка по-прежнему vialotes закон demeter, но я могу жить с этим)
- Если они могут возвращать значение null, никогда, никогда не связывайте их и не выполняйте проверку нулевых значений для каждого из них, которые могут возвращать null
Это делает любые полезные советы по фактической отладке бесполезными.