我试图从队列中获取结果,然后处理它并将其删除。但是在访问null键的情况下我得到了Java异常,见下文
int key = 0;
int size = mQueue.size();
for (int i = 0; i< size; i++) {
key = mQueue.keyAt(i);
result = mQueue.get(key);
// process(result);
mQueue.remove(result.id);
}
>>From Queue-->{
1=Result[id=1,type-1,data],
5=Result[id=5,type=40,data2],
6=Result[id=6,type=2,data3]}
>>From Loop-->
i=1, key=1
i=2, key=6<--- was expecting key= 5
i=3, key=6<--- JE here, since mQueue.get(6) =null because removed from i=2
有什么不对吗?
答案 0 :(得分:1)
当你在循环中调用mQueue.remove时,你正在改变mQueue的大小,这会让事情变得混乱。
如果您使用了ArrayList或HashMap,则可以使用迭代器并使用iterator.remove()从集合中删除next返回的最后一个对象。
或者,如果您确实需要使用SparseArray,则可以记录要删除的对象,并在新循环中执行删除操作。
int key = 0;
int size = mQueue.size();
// Assuming your result.id field is an Integer
ArrayList<Integer> forRemoval = new ArrayList();
for (int i = 0; i< size; i++) {
key = mQueue.keyAt(i);
result = mQueue.get(key);
forRemoval.add(result.id);
}
for (int i = 0; i < forRemoval.size; i++) {
mQueue.remove(forRemoval.get(i));
}
答案 1 :(得分:1)
处理mQueue
时,请勿从Result
移除。只需标记要删除的索引,并在循环结束后删除它们。关键是在迭代它时不要让SparseArray
索引发生变化。
int key = 0;
int size = mQueue.size();
List<Integer> toRemove = new ArrayList<Integer>();
for (int i = 0; i< size; i++) {
key = mQueue.keyAt(i);
result = mQueue.get(key);
// process(result);
toRemove.add(result.id);
}
for (Integer id: toRemove) {
mQueue.remove(result.id);
}
答案 2 :(得分:1)
你可以向后迭代
for (int i = mQueue.size() - 1; i >= 0; i--) {
int key = mQueue.keyAt(i);
Object result = mQueue.get(key);
process(result);
mQueue.remove(key);
}