0

这是我的代码:

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
}

我得到了例外:

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

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

4

4 回答 4

2

在哪里map初始化?如果您实际上没有为它分配任何东西,那么它当然是null.

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

于 2012-04-13T11:34:58.433 回答
1

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

于 2012-04-13T11:36:43.050 回答
1

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

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

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

}
于 2012-04-13T11:36:54.057 回答
0

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

于 2012-04-13T13:15:36.547 回答