Java 当遍历HashMap时,我得到NullPointerException

Java 当遍历HashMap时,我得到NullPointerException,java,map,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&

这是我的代码:

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
}
HashMap;
..//我没有写那些初始化地图的代码。
System.out.println(map.entrySet().size());//在这里运行util是可以的,我得到地图的大小。
对于(Map.Entry:Map.entrySet()){//这里抛出异常
Sytem.out.println(“abc”);//未执行,之前抛出异常
}
我得到一个例外:

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

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

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


(不清楚它是类成员还是局部变量。)

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


(不清楚它是类成员还是局部变量。)

如果映射确实包含元素,则
map.entrySet()
不会抛出
NullPointerException
(因为映射不是空的),因此异常必须来自访问其中一个元素(或其子对象)在循环中。

如果映射确实包含元素,则
map.entrySet()
不会抛出
NullPointerException
(因为映射不是空的),因此异常必须来自访问循环中的一个元素(或其子对象)。

我刚刚尝试了这个方法:效果很好。您的地图必须在某处指定为空

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

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

}
HashMap;
map=新的HashMap();
对于(Map.Entry:Map.entrySet()){
}

我刚试过这个:效果很好。您的地图必须在某处指定为空

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

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

}
HashMap;
map=新的HashMap();
对于(Map.Entry:Map.entrySet()){
}


如果
map
是一个局部变量(而不是一个实例字段),理论上在
map.entrySet()
上获得NPE是不可能的,因为
map.entrySet().size()。如果stacktrace中的第一个条目是一行代码,而不是从您的代码中调用的代码,那么发生这种情况的唯一方法是将
map
变量本身设置为
null
。因此,我认为您需要重新审视您的诊断线索。

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

显示的第68行是否调用了
map.entrySet
?我不认为突出显示的第68行可能是第68行。现在可能是第68行,但可能不是在添加println之前?该程序是否真的可以处理9999个对象并中断10000个对象?另外,您是否正在为
循环修改
中的映射?显示的第68行是否调用了
map.entrySet
?我认为高亮显示的那一行可能不是第68行。现在可能是第68行,但可能不是在添加println之前?该程序是否真的可以处理9999个对象并中断10000个对象?另外,您是否正在修改
循环中的
映射?@TomQuarendon我非常困惑,以至于有一个问题问到了这个问题,我不得不尝试一下。它太明显了(如果我遇到太明显的东西,我倾向于尝试,只是为了确定。)@TomQuarendon我很困惑,有一个问题问这个,我不得不尝试一下。它太明显了(如果我遇到太明显的东西,我倾向于尝试,只是为了确定。)我没有写它,而且我确定映射不是空的,因为当我打印map.entrySet().size()的大小时,我得到了它。我更新了问题,抱歉之前不清楚。在这种情况下,NPE必须来自另一行,很可能在循环中。正如@Jon Skeet所建议的,第68行到底是什么?我没有写它,而且我确信映射不是空的,因为当我打印map.entrySet().size()的大小时,我得到了它。我更新了问题,抱歉之前不清楚。在这种情况下,NPE必须来自另一行,很可能在循环中。正如@Jon Skeet所建议的,第68行到底是什么?实际上,映射是否包含任何元素一点都不重要。@MarkoTopolnik-你是对的,entrySet()将在空映射上工作(但不是在空引用上);我的观点是:如果它实际上包含elments,它就不能为null。实际上,映射是否包含任何元素一点都不重要。@MarkoTopolnik-你是对的,entrySet()将在空映射上工作(但不是在null引用上);我的观点是:如果它实际上包含elments,那么它不能为null。