【问题标题】:Java Iterator is skipping elementsJava Iterator 正在跳过元素
【发布时间】:2019-01-06 06:09:49
【问题描述】:

我在调试迭代器时注意到一个奇怪的行为;迭代器跳过了一些元素。过了一会儿,我意识到调试手表正在改变我的运行时变量值。

然后我得到了

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]

2.

【问题讨论】:

  • 我看到你打电话给planetsIterator.next() 来获得pivotsecond 而不检查hasNext()。此代码不是 MCVE,但我会检查您总是next() 之前调用 hasNext()
  • 您认为调试手表在做什么?它执行表达式,以便向您显示结果。如果表达式是next() 调用,则它调用next()。这有什么惊人的? --- 为具有副作用的表达式创建监视是一个坏主意。不要这样做。
  • @cepix 您能否提供一个完整的工作示例(github 链接可以)。

标签: java debugging intellij-idea iterator


【解决方案1】:

与调试观察者无关。

这可能会有所帮助:来自LinkedHashMap

在访问排序的链式哈希映射中,仅用get查询映射是一种结构修改

假设你为linkedhashmap构造函数的有序访问传递了true,你会导致每次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 来避免这种行为。

请注意,此实现不同步。因此,它不是线程安全的。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2015-10-29
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多