gpt4 book ai didi

Java LinkedList 迭代器过早耗尽

转载 作者:行者123 更新时间:2023-12-01 07:41:19 24 4
gpt4 key购买 nike

我正在使用 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)
}

关于Java LinkedList 迭代器过早耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com