【问题标题】:Null pointer when moving data around移动数据时的空指针
【发布时间】:2010-08-17 10:47:51
【问题描述】:

我有一个函数填充字符串数组的HashMap(rMap)。一旦满足某些条件,例如 r.Map.size() != 0 我然后,在另一个文件中(rMap 是一个全局变量)调用下面的 String array[] = rMap.get(0) 从这个我尝试 System.out.println(array[0])

这是程序的运行,我在System.out.println(array[0]); 得到一个空指针。有人知道为什么会发生这种情况吗?

编辑:我正在像这样填充地图..

String center[] = new String[] { tname, tmessage, tlink, tsname };
Global.rMap.put(index, center);

数组中的所有值都是字符串变量。所以我正在访问它的值tname 并且它不等于 null。我已经检查过了。我的键值是一个字符串

【问题讨论】:

  • 您能否再添加一点代码,以便我们可以清楚地看到您将 index 设置为什么?

标签: java arrays hashtable


【解决方案1】:

array 引用为空,很可能是因为没有向 rMap 添加值(或 null),键为 0

如果可能,请使用泛型来确保您的键是正确的类型。您还可以在获取 array 之前打印出地图的值以查看地图中的内容。使用调试器单步执行代码,并在rMap 上进行监视,还将显示地图包含的内容以及更改时间。

【讨论】:

    【解决方案2】:

    你是如何填满地图的?您确定要在其中放入一个 Integer 键为 0 的非空条目吗?

    嗯,我们可以肯定你不是。可能的原因:

    • 填充代码中的错误导致未执行预期的 put 或使用不同的键值
    • 您正在使用 ShortByte 对象作为键
    • 您将null 值放入0 键下的映射中

    您可以通过在调试器中运行代码并查看映射的内容来自己回答这个问题。

    更新:

    我的键值是一个字符串

    嗯,这就是你的问题。 rMap.get(0) 将查找 Integer,它与字符串 "0" 的条目不匹配。

    【讨论】:

      【解决方案3】:

      HashMap 允许空值,因此您使用 String array[] =rMap.get(0); 获得的值可能为空。访问空数组然后抛出 NPE。

      【讨论】:

        【解决方案4】:

        试试 rMap.get(Integer.valueOf(0));

        【讨论】:

          【解决方案5】:

          在调用 Map 实现的 get 方法时出现问题,java.util.Map 的 get 方法的签名是 get(java.lang.Object),因此,任何对象都将被接受为它的参数。

          正常工作的键是将字符串(值=0)作为键传递或覆盖非 java.lang.String 对象的参数对象的 hashCode 和 equals 方法。

          【讨论】:

            【解决方案6】:

            Hashmap 的 get() 方法用一个键,而不是一个索引,来标识你想要获取的值。如果你想要一个有序的项目列表,你需要使用 List 子类(或者强制排序,你自己)。如果要使用 Hashmap,请使用 keys() 方法获取映射所有键的枚举。

            (由于问题澄清,删除了上面的文字。留下下面的文字,即使这不是问题,这是一个重要的考虑因素)

            此外,您需要非常小心,不要创建竞争条件,因为您正在跨线程工作。虽然 Java 的本机 Hashtable 是同步的,但这并不意味着其中的数据是同步的。也就是说,您可以在一个 htread 中使用 MyObj obj = get(xxx),Nd 开始在两个单独的线程中操作 obj,可能会相互踩踏。根据您的应用程序,您可能希望使用 Hashtable.remove() 以便数据从地图中消失并且无法重复使用,或者您可能需要一些同步块(remove() 可能是更简单的实现,虽然您必须优雅地处理地图首先有数据,然后数据消失的情况)。

            【讨论】:

              猜你喜欢
              • 2018-11-08
              • 1970-01-01
              • 2014-01-27
              • 1970-01-01
              • 2016-05-14
              • 2018-06-21
              • 2015-11-28
              • 2014-01-24
              • 2016-03-27
              相关资源
              最近更新 更多