Java ArrayIndexOutOfBounds 数组映射异常

Java ArrayIndexOutOfBounds Exception on array map

我有一个迭代 ArrayMap 键的代码,但由于未知原因我得到了一个数组索引越界异常

来自 Crashalytics:

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=56; index=56
android.util.ArrayMap.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())

知道我做错了什么吗?

试试这个

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);
        }
    }
}

您正在修改正在迭代的 ArrayMap。这是 Java 中的反模式,会导致错误。我建议您使用另一个 ArrayMap 进行修改。

您不能在迭代时从 MapList 中删除。 使用Map/List的内部清除方法。 例如,handlers.clear();

代码:

private ArrayMap<String,RequestData> handlers = new ArrayMap<>();

public void removeAllHandlers() {
        synchronized (handlers) {
                handlers.clear();
        }
    }

正如其他人提到的,您不能在 for loopremove(Object o),您必须使用 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();
                 }
            }
    }
}