当遍历一个HashMap,我得到NullPointerException异常

当遍历一个HashMap,我得到NullPointerException异常

问题描述:

这是我的代码:当遍历一个HashMap,我得到NullPointerException异常

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 
} 

我得到异常:在线程

异常 “主” 显示java.lang.NullPointerException 在key.test .EnwikiOutlink.main(EnwikiOutlink.java:68)

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

+4

第68行显示调用'map.entrySet'? – 2012-04-13 11:34:25

+0

'map'初始化在哪里? – hmjd 2012-04-13 11:34:47

+0

我不认为突出显示的行可以是第68行。现在可能是第68行,但是可能不是在添加println之前? – 2012-04-13 11:49:05

map在哪里初始化?如果你实际上没有分配任何东西,当然它会是null

(如果它是一个类成员,或者一个局部变量目前尚不清楚。)

+0

我没有写它,我敢肯定地图不是null,因为当我打印map.entrySet()。size()的大小时,我知道了。我更新了这个问题,抱歉不清楚。 – janekey 2012-04-13 11:40:15

+0

在这种情况下,NPE必须来自另一条线路,很可能在回路中。正如@Jon Skeet所说,第68行究竟是什么? – 2012-04-13 11:42:23

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

+0

实际上,地图是否包含任何元素并不重要。 – 2012-04-13 13:17:43

+0

@MarkoTopolnik - 你是对的,entrySet()可以在空映射上工作,但不能在空引用上工作;我的观点是:如果它实际上包含元素,它不能为空。 – Attila 2012-04-13 14:10:07

我刚试过这个:它工作正常。您的地图必须分配给null。

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

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

} 
+3

你必须这样做? :-) – 2012-04-13 11:38:11

+3

@TQuatarendon我很困惑,有一个问题要求我必须尝试。这太明显了(如果我遇到太明显的东西,我倾向于尝试,只是为了确定)。 ;) – 2012-04-13 11:40:05

如果map是一个局部变量(而不是一个实例字段),它是理论上是不可能得到一个NPE上map.entrySet()map.entrySet().size()已经成功,即使地图本身是另一个线程和访问线程以各种可以想象的方式改变它。如果您的堆栈跟踪中的第一个条目是您的代码的一行,而不是一些从您的代码中调用的代码,那么唯一的办法就是map变量本身为null。因此我认为你需要重新审视你的诊断线索。