我有一个填充HashMap
(rMap
)String数组的函数。一旦满足某些条件,例如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。我查过了。我的Key值是一个String
答案 0 :(得分:1)
你是如何填写地图的?您确定要将Integer
键为0的非空条目放入其中吗?
嗯,我们可以肯定你不是。可能的原因:
Short
或Byte
个对象作为键null
密钥0
值
您可以通过在调试器中运行代码并查看地图内容来自己回答这个问题。
<强>更新强>
My Key值是一个字符串
嗯,那就是你的问题。 rMap.get(0)
会查找Integer
,但它与字符串"0"
的条目不匹配。
答案 1 :(得分:1)
array
引用为空,很可能是因为没有值(或null
)已添加到rMap,密钥为0
。
如果可能,请使用泛型以确保您的密钥类型正确。您也可以在获取array
之前打印出地图的值,以查看地图中的内容。使用调试器逐步执行代码,并在rMap
上使用手表也会显示地图包含的内容以及更改时间。
答案 2 :(得分:0)
HashMap
允许空值,因此String array[] =rMap.get(0);
获得的值可能为空。访问空数组然后抛出NPE。
答案 3 :(得分:0)
Hashmap的get()方法使用键而不是索引来标识要获取的值。如果你想要一个有序的项目列表,你需要使用List子类(或强制执行排序,yaourself)。如果要使用Hashmap,请使用keys()方法获取所有地图键的枚举。
(删除上面的文字,由于问题澄清。留下文字,尽管不是问题,但这是一个重要的考虑因素)
此外,您需要非常小心,不要创建竞争条件,因为您正在跨线程工作。虽然Java的本机Hashtable是同步的,但这并不意味着其中的数据。也就是说,你可以在一个htread中使用MyObj obj = get(xxx),Nd开始在两个独立的线程中操作obj,可能相互踩踏。根据您的应用程序,您可能希望使用Hashtable.remove()以便数据从地图中消失并且无法重复使用,或者您可能需要一些同步块(remove()可能是更简单的实现,thoguh你必须优雅地处理地图首先拥有数据的条件,然后数据就会消失。
答案 4 :(得分:0)
尝试rMap.get(Integer.valueOf(0));
答案 5 :(得分:0)
当你调用Map实现的get方法时,这是一个问题,java.util.Map的get方法的签名是get(java.lang.Object),因此,任何对象都将被接受为它的参数。
正常工作的密钥要么是将字符串(value = 0)作为键传递,要么覆盖hashCode,并且等于不是java.lang.String对象的参数对象的方法。