在Java中将HashMap作为静态成员变量

3
我想为每个新类的实例创建一个HashMap作为静态成员进行传递。然而,每次尝试对HashMap进行.get或.put操作时,我都会收到NullPointerException。请帮忙解决!
我正在做:public class EmailAccount { private static HashMap<String,Integer> name_list; 然后是name_list.put(last_name, occurrences); 但是甚至name_list.containsKey(last_name);也会返回NullPointer。
这来自早期的问题:在Java中计算字符串出现次数

ObComment:可变静态变量通常是一个非常糟糕的想法。 - Tom Hawtin - tackline
4个回答

9

你需要实例化它。

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

参见:


请注意,将“list”用作映射变量名是令人困惑的。您希望它成为name_mapname_occurrences吗?顺便说一句,这个下划线实际上也不符合Java命名约定,但是这并不影响。


我先学的C++,现在正在学Java。我会看看这个建议能做什么,感谢你的快速回复!不过我想问一下,把“new”放在后面是不是会为每个实例创建一个新的HashMap?那正是我不想要的! - V1rtua1An0ma1y
不会,因为你将它声明为static。同一张地图将在同一类的所有实例之间共享。static修饰符使其成为类成员。如果你将其删除,则它将变成一个实例成员,确实会为类的每个实例创建一个新的。另请参阅Java教程-理解实例和类成员 - BalusC
@V1rtua1An0ma1y 因为它是静态的,所以它只会为类创建一个 HashMap 实例,而不是为每个 EmailAccount 实例创建一个实例。 - Zach L
非常感谢这位 Java 新手。一如既往,我很感激您的反馈 :) - V1rtua1An0ma1y

5

你仍然需要像这样初始化它:

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

当您离开一个类级对象字段而没有初始化时,或者任何对象引用,默认为null。
尽管您可能认为您想要一个HashMap,因此它应该隐式地初始化它,但Java不知道您是否实际上想要一个HashMap,或者可能是一个HashMap子类,例如LinkedHashMap。
类级基本类型,如int,可以像private static int someNumber;一样保留,不会通过访问抛出NullPointerException——但这是因为基本类型不能为null。Java将分配一些默认值(在int的情况下为0)。

当您不初始化任何对象(引用)时,它默认为 null。 - dty
@dty 是的,但我只是强调这个例子。我会改变它,以便没有混淆。谢谢 :-) - Zach L

2

你没有实例化列表。你声明了它,但没有实例化。


1
你创建了一个可以容纳HashMap的字段,但是你没有在其中放置任何内容。
你需要将new HashMap<String, Integer>()放入你的字段中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接