我有一个对ArrayMap键进行迭代的代码,由于未知原因,我得到了一个数组索引超出界限异常
来自Crashalytics:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=56; index=56
android.util.ArrayMap$1.colGetEntry (ArrayMap.java:763)
android.util.MapCollections$ArrayIterator.next (MapCollections.java:55)
代码如下:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
for (String s : handlers.keySet()) {
handlers.remove(s);
}
}
}
以下行发生了异常:for (String s : handlers.keySet())
任何提示我在做什么错吗?
答案 0 :(得分:2)
您无法在进行迭代时从Map
或List
中删除。
使用Map
/ List
的内部清除方法。
例如,handlers.clear();
代码:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
handlers.clear();
}
}
答案 1 :(得分:0)
尝试一下
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
ArrayMap<String,RequestData> tempHandlers = handlers;
for (String s : tempHandlers.keySet()) {
handlers.remove(s);
}
}
}
答案 2 :(得分:0)
您正在修改要迭代的ArrayMap。这是Java中的反模式,将导致错误。我建议您使用另一个ArrayMap进行修改。
答案 3 :(得分:0)
就像其他人提到的那样,您不能在remove(Object o)
中for loop
,您必须使用Iterator
作为
public void removeAllHandlers() {
synchronized (handlers) {
Iterator<String> keyIterator = handlers.keySet().iterator();
while (keyIterator.hasNext()) {
RequestData requestData = handlers.get(keyIterator.next());
if(iDontWant(requestData)) {
keyIterator.remove();
}
}
}
}