遍历HashMap时,我得到NullPointerException

时间:2012-04-13 11:33:27

标签: java map

这是我的代码:

HashMap<String, HashSet<String>> map;
....// I didn't write those code that initial the map.
System.out.println(map.entrySet().size()); // run util here is ok, I get the size of the map.
for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) {// here throw the exception
    Sytem.out.println("abc");// didn't executed, throw exception before
}

我得到例外:

线程“main”java.lang.NullPointerException中的异常     at key.test.EnwikiOutlink.main(EnwikiOutlink.java:68)

地图对象有超过10,000个地图对象,我在服务器机器上运行它,无法调试。 但是当我减小这个地图的大小(低于10,000)时,程序运行正常。 问题的原因和解决方案是什么?谢谢!

4 个答案:

答案 0 :(得分:2)

map在哪里初始化?如果您实际上没有为其分配任何内容,当然它将是null

(不清楚它是否是类成员或本地变量。)

答案 1 :(得分:1)

如果地图 包含元素,那么map.entrySet()将不会抛出NullPointerException(因为地图不为空),因此异常必须来自访问一个循环中的元素(或其子对象)。

答案 2 :(得分:1)

我刚试过这个:它工作得很好。您的地图必须在某处分配为空。

HashMap<String, HashSet<String>> map;
map = new HashMap<String, HashSet<String>>();

for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) {

}

答案 3 :(得分:0)

如果map是一个局部变量(而不是一个实例字段),那么map.entrySet()已经成功后,理论上不可能map.entrySet().size()上获得NPE ,即使地图本身可以被另一个线程访问,并且该线程以各种可想象的方式改变了它。如果stacktrace中的第一个条目是代码的一行,而不是从您的代码中调用的某些代码,那么发生这种情况的唯一方法是map变量本身为null 。因此,我认为您需要重新审视您的诊断线索。