HashMap как статический член в Java - PullRequest
3 голосов
/ 24 января 2011

Я хочу перенести HashMap в качестве статического члена для каждого экземпляра нового класса.Однако каждый раз, когда я пытаюсь .get или .put в мой HashMap, я получаю исключение NullPointerException.Справка!?

Я делаю: public class EmailAccount { private static HashMap<String,Integer> name_list;, а затем name_list.put(last_name, occurences); Даже name_list.containsKey(last_name); возвращает NullPointer.

Это происходит из более раннего вопроса: Подсчет вхождений строк вJava

Ответы [ 4 ]

9 голосов
/ 24 января 2011

Вам нужно создать его экземпляр.

private static Map<String, Integer> name_list = new HashMap<String, Integer>();

См. Также:


Обратите внимание, что использование «list» в имени переменной карты сбивает с толку.Разве вы не хотите, чтобы это был name_map или name_occurences?Это подчеркивание, кстати, также не совсем вписывается в соглашения об именах Java , но это в сторону.

5 голосов
/ 24 января 2011

Вам все еще нужно инициализировать его, как

private static HashMap<String, Integer> name_list = new HashMap<String, Integer>();

Когда вы оставляете поле объекта уровня класса без инициализации - или любой ссылки на объект, в этом отношении, по умолчанию оно имеет значение null.

Хотя вам может показаться очевидным, что вы хотите HashMap, поэтому он должен просто неявно инициализировать его, но Java не знает, хотите ли вы на самом деле HashMap или, возможно, подкласс HashMap, например LinkedHashMap

Примитивы уровня класса , например int, могут быть оставлены как private static int someNumber; и не будут вызывать исключение NullPointerException при обращении к нему - но это потому, что примитивы не могут быть нулевыми. Java назначит ему некоторое значение по умолчанию (в случае int, 0).

2 голосов
/ 24 января 2011

Вы не создали экземпляр списка.Вы объявили это, но не создали экземпляр.

1 голос
/ 24 января 2011

Вы создали поле, которое может содержать HashMap, но вы ничего не вложили в него

Вам нужно поместить new HashMap<String, Integer>() в ваше поле.

...