这是我的代码:
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)时,程序运行正常。 问题的原因和解决方案是什么?谢谢!
答案 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
。因此,我认为您需要重新审视您的诊断线索。