Java LinkedList迭代器过早耗尽

Java LinkedList迭代器过早耗尽,java,collections,iterator,Java,Collections,Iterator,我正在使用LinkedList并使用list.Iterator()检索Iterator对象。之后,我检查it.hasNext(),真正的问题是在检查it.hasNext()时,有时它返回false。我需要帮助为什么会发生这种情况,尽管我在列表中有一些元素 一些代码: public synchronized void check(Object obj) throws Exception { Iterator itr = list.iterator(); while(itr.has

我正在使用
LinkedList
并使用
list.Iterator()
检索
Iterator
对象。之后,我检查
it.hasNext()
,真正的问题是在检查
it.hasNext()
时,有时它返回
false
。我需要帮助为什么会发生这种情况,尽管我在列表中有一些元素

一些代码:

public synchronized void check(Object obj) throws Exception {
    Iterator itr = list.iterator();

    while(itr.hasNext()) { //This Line I get false.. though i have list size is 1

        Item p = (Item)itr.next();
        if(p.getId() == null) {continue;}
        if(p.getId().getElemntId() == obj.getId() || obj.getId() == 0 ) {
            p.setResponse(obj);
            notifyAll();
            return;
        }
    }
    Log.Error("validate failed obj.getId="+obj.getId()+" **list.size="+list.size()*This shows 1*);
    throw new Exception("InvalidData");
}
…好的,hasNext()在到达列表末尾时返回false。 请发布您的代码,看看有什么问题。要么列表中没有预期的元素,要么调用next()的频率比预期的要高

编辑: 实际上,由于它是多线程的,Nishant说得对,请使用以下命令检查您的列表是否是线程安全的:

List list = Collections.synchronizedList(new LinkedList(...));
编辑2:

可能有两个线程同时访问列表。如果错误有时发生,有时不发生,可能就是这种情况

如果有这样一段代码在多个线程中运行:

if (it.hasNext())
  T elem = it.next()
  process(elem)
可能是: 线程1和线程2说“好的,还有下一个元素”,然后切换上下文,然后两者在某个时间再次运行,并且都希望检索一个元素,尽管只有一个可用

要解决此问题,请使您的方法“同步”

  synchronized void processItem(Iterator<T> it)
  {
    if (it.hasNext())
      T elem = it.next()
      process(elem)
  }
synchronized void processItem(迭代器)
{
if(it.hasNext())
T elem=it.next()
过程(elem)
}

看看这个,它不是线程安全的。如果您使用的是多线程代码,请确保它是同步的

请注意,此实现未同步。如果多个线程同时访问链接列表,并且至少有一个线程在结构上修改了该列表,则必须在外部对其进行同步。(结构修改是添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这通常通过在自然封装列表的某个对象上进行同步来完成。如果不存在此类对象,则应“包装”列表使用Collections.synchronizedList方法。这最好在创建时完成,以防止对列表的意外非同步访问:


经过如此多的调试,我们能够找到根本原因,并且是由于套接字之间的超时,它被从列表中删除

谢谢
Sujeet

如果it.hasNext()==false,则表示您的列表为空。要获得更完整的答案,我们需要查看一些代码…@Sujeet尝试通过打印list.size()进行调试——即使列表中有元素,迭代器也不太可能返回false(假设它的编码正确)这是一个多线程应用程序..无法共享完整的代码:(.我需要帮助,就像你遇到过这种问题一样..是否有任何场景需要它。hasNext()尽管列表不是空的,但返回false。是否对其进行多次迭代?
Iterator
s仅适用于一次迭代,然后必须调用
list.Iterator()
获取一个新的
迭代器
。你说它是一个多线程应用程序。是否有多个线程访问这个
链接列表
和/或这个
迭代器
?@Sujeet:如果你的列表包含7项,那么你可以在
它.hasNext()之前调用
它.next()
7次
返回
false
。此时,您已到达列表的末尾。因为我将缓存限制为仅1个元素。您实际上是在循环中对列表进行迭代吗?
Iterator.hasNext()当迭代器到达列表末尾时,
当然会返回false。请注意,简单地将列表更改为同步列表并不会使其安全,您仍然会得到
ConcurrentModificationException
。更安全的方法是
CopyOnWriteArrayList
,前提是读取比写入更常见。只有在尝试的情况下要在对列表进行迭代的同时向列表中实际添加某些内容,公共同步无效检查(Object obj)会引发异常{Iterator itr=list.Iterator();而(itr.hasNext()){Item p=(Item)itr.next();if(p.getId()=null){continue;}if(p.getId().getElemntId()==obj.getId()| obj.getId())==0){p.setResponse(obj);notifyAll();return;}}}Log.Error(“验证失败的obj.getId=“+obj.getId()+”list.size=“+list.size());引发新异常(“InvalidData”);}
List list = Collections.synchronizedList(new LinkedList(...));