NullPointerException при использовании метода put HashMap

Следующий код дает мне NullPointerException. Проблема в следующей строке:

... 
dataMap.put(nextLine[0], nextLine[6]);

Что странно, так это то, что я запустил этот код без указанной выше строки, и вызовы nextLine[0] и nextLine[6] работают точно так, как ожидалось, то есть они возвращают мне элементы файла csv. Я объявляю и инициализирую HashMap кодом

HashMap<String, String> dataMap = null;

ранее в методе

  String[] nextLine;
  int counter=0;
  while (counter<40) {
    counter++;

    System.out.println(counter);
    nextLine = reader.readNext(); 
    // nextLine[] is an array of values from the line
    System.out.println(nextLine[0] + " - " + nextLine[6] +" - " + "etc...");
    dataMap.put(nextLine[0], nextLine[6]);
  }
  return dataMap;
}

person Ankur    schedule 09.04.2009    source источник
comment
Меня просто удивляют 24 балла за такую ​​тривиальную проблему с кодированием для новичков.   -  person    schedule 10.02.2021


Ответы (6)


HashMap<String, String> dataMap = new HashMap<String,String>();

Ваша переменная dataMap на данный момент не инициализирована. Вы должны получить предупреждение компилятора об этом.

person Codingscape    schedule 09.04.2009
comment
Разве проблема не в том, что он явно инициализирован? Обнулить? - person Brian Agnew; 09.04.2009
comment
Я думаю, что Codingscape имеет в виду, что не создается экземпляр - person matt b; 09.04.2009
comment
Собственно, здесь есть подсказка. Он не получил предупреждения, потому что он инициализировал его значением null, чтобы переопределить предупреждение компилятора, которое он, конечно же, получал. Вы должны сделать привычкой НЕ инициализировать переменные нейтральным значением по умолчанию, а только устанавливать их в их реальное значение, чтобы компилятор мог предупредить. - person Bill K; 09.04.2009

Где инициализируется карта данных? Это всегда ноль.

Чтобы уточнить, вы объявляете переменную и устанавливаете для нее значение null. Но вам нужно создать новую карту, будь то HashMap или что-то подобное.

e.g.

datamap = new HashMap();

(не считая дженериков и т.д.)

person Brian Agnew    schedule 09.04.2009
comment
Да, очень странно, что разыменование указателя, который явно равен нулю, вызовет исключение NullPointerException. - person Apocalisp; 09.04.2009

dataMap объявлен, но не инициализирован. Его можно инициализировать с помощью

карта данных = новая HashMap();

person Sheldon    schedule 09.04.2009

Итак, в этой строке есть доступ к трем объектам. Если nextLine[0] и nextLine[6] не равны нулю, потому что вышеописанный вызов println сработал, остается dataMap. Вы сделали dataMap = new HashMap(); где-то?

person jcopenha    schedule 09.04.2009

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

HashMap<String, Integer> map = new HashMap<String, Integer>();

Который пуст или имеет ключи, кроме someKey, поэтому, когда я пытаюсь

map.get("someKey") == 0;

Теперь это приведет к исключению nullPointerExeption из-за сопоставления нуля с некоторым целым числом.

Что мне делать вместо этого?

Ответ: вместо этого я должен проверить значение null, например

map.get("someKey") != null;

Теперь ошибка времени выполнения Nullpointer не возникает!

person SaadurRehman    schedule 10.02.2021

Хм, а что именно вы ожидаете, когда делаете это?

HashMap<String, String> dataMap = null;
...
dataMap.put(...)
person Michael Borgwardt    schedule 09.04.2009
comment
Я ожидал, что null является своего рода заполнителем, но когда вы используете put, значение, которое ставится, делает HashMap больше не равным null - person Ankur; 09.04.2009
comment
Если поставить везде =null, моя программа запишется сама? - person mP.; 10.04.2009
comment
...и почему здесь минус? Я начинаю сомневаться в объективности сообщества Stackoverflow. - person ; 10.02.2021