Относится ли это исключение NullPointerException к getFoos, возвращающему null, или к какой-либо проблеме с приведением из коллекции в ArrayList? - PullRequest
0 голосов
/ 21 августа 2010

Почему эта строка вызывает NullPointerException:

    List<Foo> foos = new ArrayList<Foo>(userDetailsService.getFoos(currentUser));

Метод getFoos просто возвращает Collection из Foo s:

    public Collection<Foo> getFoos(final String username)

Я не могу сказать, относится ли NullPointerException к getFoos, возвращающему null, или к какой-то проблеме с приведением от Collection к ArrayList.

Ответы [ 3 ]

2 голосов
/ 21 августа 2010

Зависит от трассировки стека.Идите к первой линии.Если он указывает на java.util.ArrayList.<init>, то getFoos() вернул null.Или, если он указывает на конкретную строку в вашем вопросе, то userDetailsService равно null.

1 голос
/ 21 августа 2010

Я не могу сказать, относится ли исключение NullPointerException к getFoos, возвращающему null, или к какой-либо проблеме с приведением из коллекции в ArrayList.

И вот почему у нас есть Закон Деметры .Если вы разделите два оператора, которые были соединены вместе, вам бы больше повезло в решении проблемы.

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

EDIT :

Мои ошибки.Конструктор ArrayList попытается скопировать коллекцию.Таким образом, нулевая коллекция может вызвать исключение нулевого указателя.Я придерживаюсь своей первоначальной рекомендации о разделении двух заявлений.Кодирование следующим образом поможет быстрее выявить проблему:

Collection<Foo> myFoos = userDetailsService.getFoos(currentUser);
List<Foo> foos = new ArrayList<Foo>(myFoos);
0 голосов
/ 21 августа 2010

Неудачный тип передачи не может дать вам NullPointerException.

Object o = new Integer(43);
String s = (String) o;  // throws ClassCastException

При типе null исключение не выдается вообще.

o = null;
String s = (String) o;  // no exception

Поэтому теория о том, что getFoo возвращает null, правдоподобна. Но возможно также, что userDetailsService - это null или что NPE брошен в getFoo.

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

...