在通过Iterator进行调试时,我注意到一个奇怪的行为;该Iterator跳过了一些元素。一段时间后,我意识到 调试手表正在更改我的运行时变量值。
然后我得到
Caused by: java.util.NoSuchElementException: null
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:721) ~[na:1.8.0_181]
at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742) ~[na:1.8.0_181]
答案 0 :(得分:0)
与调试监视程序无关。
这可能会有所帮助:来自LinkedHashMap
在访问顺序链接的哈希表中,仅使用get查询该表是结构上的修改
假设您通过了true时,linkhashmap构造函数的有序访问会导致每次get操作的结构更改。
您的时间
while(planetsIterator.hasNext() && ...) {
Planet planet = planetsIterator.next();
...
}
被编译为
Iterator<Planet> it = planetsIterator.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
Planet planet = planetsIterator.get(key);
...
}
因此,get运算符引起结构更改。
您可以使用EntrySet来避免这种情况。
请注意,此实现未同步。因此,它不是线程安全的。