2010-08-17 46 views
1

我有一个填充字符串数组的HashMaprMap)的函数。一旦满足某些条件,例如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。我查过了。我的密钥值是一个字符串

+0

你可以添加多一点的代码,所以我们可以明确地看到你的设置索引? – atk 2010-08-17 14:22:16

回答

0

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

1

你是如何填写地图?你确定你正在把一个Integer键为0的非空条目放入它吗?

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

  • 以导致填充代码中的错误预期放不被执行,或者使用不同的密钥值
  • 您使用ShortByte对象作为键
  • 你把一个null值到地图下的0关键

您可以通过在调试器中运行代码,看地图的内容,回答自己这个问题。

更新:

我的Key值是一个字符串

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

+0

已更新我的代码以反映您的问题。 – Skizit 2010-08-17 11:14:41

+0

@Meowmix:更新了答案以反映您的更新。 – 2010-08-17 12:17:52

1

array引用为空,很可能是因为没有值(或null)已被添加到rMap,密钥0

如果可能,请使用泛型来确保您的密钥是正确的类型。您也可以在获取array之前打印出地图的值,以查看地图中的内容。通过调试器逐步浏览代码,rMap上的手表也将显示地图包含的内容以及更改时间。

0

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

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

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

0

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

工作正常的关键是传递一个字符串(值为0)作为键或覆盖hashCode并等于不是java.lang.String对象的参数对象的方法。

相关问题