gpt4 book ai didi

java - 迭代时出现 NoSuchElementException

转载 作者:行者123 更新时间:2023-12-02 05:39:37 26 4
gpt4 key购买 nike

在过去的几个小时里,我一直对迭代器感到震惊。

当我执行Iterator时,得到NoSuchElementException

代码

    new Thread() {
@Override
public void run() {
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

final HashSet<String> mList = new HashSet<String>();
for (SomeList sList : refList) { // <-- 72 Items
if (sList.isTrue()) {
mList.add(sList.getName());
}
}
System.out.println("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");

System.out.println("sList " + sList.size()); // <-- 3 Items

final Iterator<String> iterator = mList.iterator();
while (iterator.hasNext()) { // Check if has next element
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("zzzzzzzzzzzzzz");
System.out.println("\n-------------------- " + (String) iterator.next()); //move to next element
}
});
}
}
}.start();

Logcat

    D/dalvikvm(25527): start new thread
D/dalvikvm(25527): threadid=13: notify debugger
D/dalvikvm(25527): threadid=13 (Thread-4167): calling run()
I/System.out(25527): xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
I/System.out(25527): wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
I/System.out(25527): mList 3 <-- Size of List
I/System.out(25527): yyyyyyyyyyyyyyyyyyyyyy
I/System.out(25527): yyyyyyyyyyyyyyyyyyyyyy

// Prints around 80 times removed for better readability

I/System.out(25527): yyyyyyyyyyyyyyyyyyyyyy
I/System.out(25527): yyyyyyyyyyyyyyyyyyyyyy
I/System.out(25527): zzzzzzzzzzzzzz
I/System.out(25527): -------------------- abc <-- data 1
I/System.out(25527): yyyyyyyyyyyyyyyyyyyyyy
I/System.out(25527): zzzzzzzzzzzzzz
I/System.out(25527): -------------------- efg <-- data 2
I/System.out(25527): zzzzzzzzzzzzzz
I/System.out(25527): -------------------- hij <-- data 3
I/System.out(25527): zzzzzzzzzzzzzz
D/AndroidRuntime(25527): Shutting down VM
W/dalvikvm(25527): threadid=1: thread exiting with uncaught exception (group=0x41c5c9a8)
D/dalvikvm(25527): threadid=13: exiting
D/dalvikvm(25527): threadid=13: bye!
E/AndroidRuntime(25527): FATAL EXCEPTION: main
E/AndroidRuntime(25527): java.util.NoSuchElementException
E/AndroidRuntime(25527): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:794)
E/AndroidRuntime(25527): at java.util.HashMap$KeyIterator.next(HashMap.java:819)
E/AndroidRuntime(25527): at xxx.xxx.xxxxxx.models.YYYYY$1$1.run(YYYYY.java:62) <-- Here is the exception.
E/AndroidRuntime(25527): at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime(25527): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(25527): at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime(25527): at android.app.ActivityThread.main(ActivityThread.java:5299)
E/AndroidRuntime(25527): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(25527): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(25527): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
E/AndroidRuntime(25527): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
E/AndroidRuntime(25527): at dalvik.system.NativeStart.main(Native Method)
<小时/>

我的代码中的第 62 行是

System.out.println("\n-------------------- " + (String) iterator.next());

在发布这个问题之前,我搜索了NoSuchElementException, Iterator ,尝试了大部分结果但没有成功。

最佳答案

这里存在并发问题:

while (iterator.hasNext()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
(String) iterator.next();
}
});
}

因为 hasNextnext 不是在同一个线程上调用,所以不能保证当你调用 next()< 时实际上会有一个 next/.

循环将在迭代器不前进的情况下运行多次,导致创建的 Runnable 数量多于迭代器中的项目,进而导致调用 next次数超出应有的次数。

您可以使用以下方法解决它:

while (iterator.hasNext()) {
final String nextValue = (String) iterator.next();
runOnUiThread(new Runnable() {
@Override
public void run() {
// Do stuff with nextValue
}
});
}

在同一线程中调用 hasNextnext,确保每个 hasNext 立即通过对 next< 的调用进行匹配

关于java - 迭代时出现 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24619273/

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