数组映射上的Java ArrayIndexOutOfBounds异常

时间:2018-08-14 08:22:53

标签: java android indexoutofboundsexception array-map

我有一个对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())

任何提示我在做什么错吗?

4 个答案:

答案 0 :(得分:2)

您无法在进行迭代时从MapList中删除。 使用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();
                 }
            }
    }
}