【问题标题】:Java ArrayIndexOutOfBounds Exception on array map数组映射上的 Java ArrayIndexOutOfBounds 异常
【发布时间】:2018-08-14 08:22:52
【问题描述】:

我有一个迭代 ArrayMap 键的代码,但由于未知原因,我得到了一个 Array Index Out Of Bounds 异常

来自 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())

任何线索我做错了什么?

【问题讨论】:

  • 索引在 Java 中为 0,最大索引为 55,您正在尝试检索具有 56 个元素的数组的第 57 个元素。在迭代同一个地图时从地图中删除元素是自找麻烦。
  • handlers.clear() 怎么样?

标签: java android indexoutofboundsexception array-map


【解决方案1】:

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

代码:

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

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

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        正如其他人提到的那样,您不能在 for loop 中使用 remove(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();
                         }
                    }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-05-01
          • 1970-01-01
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-18
          • 2013-07-31
          • 1970-01-01
          相关资源
          最近更新 更多