HashMap как статический член в java

Я хочу переносить 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


person V1rtua1An0ma1y    schedule 23.01.2011    source источник
comment
ObComment: Изменяемая статика вообще очень плохая идея.   -  person Tom Hawtin - tackline    schedule 24.01.2011


Ответы (4)


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

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

Смотрите также:


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

person BalusC    schedule 23.01.2011
comment
Сначала я изучил C++, а сейчас только java. Я посмотрю, что я могу сделать с этим советом, спасибо за быстрый ответ! Но позвольте мне спросить, разве установка new не приводит к созданию нового HashMap для каждого экземпляра? Это именно то, чего я не хочу! - person V1rtua1An0ma1y; 24.01.2011
comment
Нет, так как вы объявили его static. Одна и та же карта будет использоваться всеми экземплярами одного класса. Модификатор static делает его членом класса. Если вы удалите его, он станет членом экземпляра, и действительно, для каждого экземпляра класса будет создан новый. См. также учебное пособие по Java — Общие сведения об экземплярах и членах классов. - person BalusC; 24.01.2011
comment
@ V1rtua1An0ma1y, поскольку он статичен, он создаст только один экземпляр HashMap для класса, а не по одному для каждого экземпляра EmailAccount. - person Zach L; 24.01.2011
comment
Большое спасибо от этого java noob. Как всегда, я ценю обратную связь :) - person V1rtua1An0ma1y; 24.01.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).

person Zach L    schedule 23.01.2011
comment
Когда вы оставляете ЛЮБОЙ объект (ссылку) без инициализации, по умолчанию он равен нулю. - person dty; 24.01.2011
comment
@dty Верно, но я просто подчеркнул этот пример. Поменяю, чтобы не было путаницы. Спасибо :-) - person Zach L; 24.01.2011

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

person rfeak    schedule 23.01.2011

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

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

person SLaks    schedule 23.01.2011