Как это нулевое исключение? - PullRequest
0 голосов
/ 03 октября 2011

Я действительно запутался: я просто пытаюсь добавить имена каждого объекта в ArrayList к другому ArrayList.

for (int i = 0; i < availableParts.size(); i++) {
    for (int j = 0; j < namesOfIngredients.size(); j++){
         if (availableParts.get(i).getName() != namesOfParts.get(j)){
             namesOfParts.add(availableParts.get(i).getName());
         }
    }//middle if statement makes sure there are no repeats
}

РЕДАКТИРОВАТЬ: я понимаю, что namesOfIngredients имеет значение null. Тем не менее, мне нужно, чтобы начать с нуля - так я копирую имена. Разве это не может быть сделано таким образом?

Ответы [ 6 ]

8 голосов
/ 03 октября 2011

Убедитесь, что

  1. оба списка availableParts и namesOfIngredients не null
  2. Список, в который вы добавляете элементы (namesOfParts), был правильно инициализирован конструктором (это не null).
  3. Все элементы в этих списках не null

И помните, что сравнение строк выполняется с String.equals(). Проверка равенства (==) на двух объектах String вернет true, только если они являются одним и тем же экземпляром.

В качестве примечания можно использовать List.contains(), чтобы выяснить, есть ли название определенной детали в списке namesOfIngredients. Также, возможно, это опечатка, но вы должны проверить IndexOutOfBoundsException на namesOfParts.get(j) в этой проверке равенства.

3 голосов
/ 03 октября 2011

Вы пытаетесь взглянуть на namesOfParts в самом цикле, но в определении цикла вы переходите к длине namesOfIngredients.Является ли один из них нулевым?Бьюсь об заклад, один.

0 голосов
/ 03 октября 2011

Учитывая ваше редактирование - как вы объявляете namesOfIngredients?

должно быть

Object namesOfIngredients = new Object(); 

не

Object namesOfIngredients;
0 голосов
/ 03 октября 2011

Похоже, вы вызываете несколько методов в вашем цикле, не проверяя, является ли объект, для которого вы его вызываете, пустым или нет. ВСЕГДА рекомендуется делать это (особенно, если вы не уверены в контракте объекта, возвращаемого данным методом)

Таким образом, в основном, когда вы делаете что-то вроде object.method() и / или object.method1().method2(), убедитесь, что object и / или object.method1() НЕ НУЛЬ, прежде чем вызывать последующие методы для их возвращаемых значений.

Кроме того, вы можете прерывать вызовы следующим образом, чтобы лучше отлаживать и ловить NPE в точном месте:

Object returnObj = object.method1();
Object anotherReturn = returnObj.method2();
0 голосов
/ 03 октября 2011

Мы не знаем: мы не можем видеть, как инициализируются availableParts и namesOfParts.

Но мы можем рассказать вам, как это выяснить.Добавьте операторы печати следующим образом:

print "Before I try it"
print availableParts.get(i)
print namesOfParts(availableParts.get(i))
print "done"

, когда это NPE, вы точно увидите, кто из них сделал.

0 голосов
/ 03 октября 2011

availableParts.get (i), вероятно, равно нулю, и поэтому вызов getName () приводит к NPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...