2009-04-09 3 views
13

Следующий код дает мне NullPointerException. Проблема заключается в том на следующей строке:NullPointerException при использовании метода put из HashMap

... 
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; 
} 

ответ

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

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

+0

Не правда ли, что это * явно * инициализировано? Нулевое значение? –

+0

Я думаю, что Codingscape означает «не создается» –

+0

На самом деле, есть подсказка. Он не получил предупреждения, потому что он инициализировал его нулевым, чтобы переопределить предупреждение компилятора, которое он, конечно, получал. Вы должны сделать привычкой НЕ инициализировать переменные до значения «Нейтральное» по умолчанию, только установите их на их реальное значение, чтобы компилятор мог предупредить. –

5

Где datamap инициализируется? Он всегда равен нулю.

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

например.

datamap = new HashMap(); 

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

+0

Да, очень странно, что разыменование указателя, явно равного нулю, приведет к исключению NullPointerException. – Apocalisp

3

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

datamap = new HashMap();

1

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

0

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

HashMap<String, String> dataMap = null; 
... 
dataMap.put(...) 
+2

Я ожидал, что null является своего рода владельцем места, но когда вы используете put, значение «put» делает HashMap больше не равным нулю. – Ankur

+0

Если put = null всюду будет записывать моя программа? –

Смежные вопросы