【问题标题】:HashMap as a static member in javaHashMap作为java中的静态成员
【发布时间】:2011-01-23 22:14:47
【问题描述】:

我想为新类的每个实例携带一个 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。

这来自较早的问题:Count occurrences of strings in Java

【问题讨论】:

  • ObComment:可变静态通常是一个非常糟糕的主意。

标签: java hashmap static-members


【解决方案1】:

你需要实例化它。

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

另见:


请注意,在地图的变量名称中使用“列表”会造成混淆。你不希望它是name_mapname_occurences 吗?顺便说一句,这个下划线也确实不适合Java naming conventions,但除此之外。

【讨论】:

  • 我先学习了 C++,然后才开始学习 java。我会看看我能用这个建议做什么,感谢您的快速回复!不过,让我问这个问题,“新”不是最终为每个实例创建一个新的 HashMap 吗?这正是我不想要的!
  • 不,自从你声明它static 之后它就没有了。同一个映射将在同一个类的所有实例之间共享。 static 修饰符使其成为类成员。如果您删除它,那么它将成为一个实例成员,并且实际上将为该类的每个实例创建一个新成员。另见Java tutorial - Understanding instance and class members
  • @V1rtua1An0ma1y 因为它是静态的,它只会为类创建一个 HashMap 实例,而不是为每个 EmailAccount 实例创建一个。
  • 非常感谢这个 java 菜鸟。一如既往,感谢您的反馈:)
【解决方案2】:

你还是需要初始化一下,比如

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)。

【讨论】:

  • 当你离开任何没有初始化的对象(引用)时,它默认为空。
  • @dty 是的,但我只是在强调这个例子。我会改变它,所以没有混乱。谢谢:-)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你创建了一个可以容纳 HashMap 的字段,但你没有在里面放任何东西

    您需要在字段中输入new HashMap&lt;String, Integer&gt;()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多