过去几个小时我被Iterator
击中。
当我执行 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(&#34; \ n --------------------&#34; +(String)iterator.next());
在发布此问题之前,我搜索了NoSuchElementException, Iterator,尝试了大部分结果,但没有成功。
答案 0 :(得分:2)
这里存在并发问题:
while (iterator.hasNext()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
(String) iterator.next();
}
});
}
由于hasNext
和next
未在同一个帖子中调用,因此无法保证在您拨打next()
时确实存在下一个。
循环将运行几次而迭代器不会被提前,导致Runnable
的创建比迭代器中的项更多,这反过来会导致next
被调用的次数超过应有的次数。
您可以使用以下方法解决问题:
while (iterator.hasNext()) {
final String nextValue = (String) iterator.next();
runOnUiThread(new Runnable() {
@Override
public void run() {
// Do stuff with nextValue
}
});
}
在同一个帖子中调用hasNext
和next
,确保通过调用hasNext
next