【问题标题】:ArrayIndexOutOfBoundsException when doing removeAt in map在地图中执行 removeAt 时出现 ArrayIndexOutOfBoundsException
【发布时间】:2020-04-14 14:43:35
【问题描述】:

我尝试在未选中时从地图中删除一个值,但由于某种原因,它给了我一个 IndexOutOfBoundsException

itemView.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
    item.isChecked = isChecked
    if(isChecked){
     map.put(position,true)
    } else {
        map.removeAt(position)
    }
}

这里我有 2 个复选框,当我检查两个都可以时。当我取消选中第一个是可以的,但是当我尝试取消选中第二个时,它会因为这个错误而崩溃

 java.lang.ArrayIndexOutOfBoundsException: src.length=11 srcPos=2 dst.length=11 dstPos=1 length=-1

问题出在map.removeAt(position),但我不知道它为什么会失败,因为该位置是数组中实际存在的元素。

我正在使用SparseBooleanArray

【问题讨论】:

    标签: java android arrays kotlin android-recyclerview


    【解决方案1】:

    您的代码没有显示position 的设置位置,但如果我不得不猜测,您可能需要设置position - 1

    请记住,您的数组是 0 索引的!

    【讨论】:

      【解决方案2】:

      问题不是我说的数组的位置,因为这个数组永远不会改变(我从不删除它上面的任何项目,只是删除地图上包含这个映射布尔值的值)

      所以问题出在 removeAt(position)

      例子

      我有一个包含 2 个值的 Map 数组

      0 - true
      1 - true
      

      如果我现在做map.RemoveAt(0) 我有

      1 - true (actually in position 0 right now)
      

      但现在如果我再次尝试map.removeAt(1),位置 1 中没有元素,所以这就是出界的原因

      我已经通过在地图中按键删除解决了

      map.remove(position,true) 
      

      所以这将删除那个 1 - true 值,并且只删除带有 true 的值作为该映射的值

      【讨论】:

        【解决方案3】:

        我看到了您发布的答案。是的,你已经正确地理解了这一点。您收到 IndexOutOfBoundException 是因为您正在寻找的职位已被删除。

        但是,您不必使用 key-value 对从地图中删除该元素。它会降低 Map 对象的可伸缩性,因为在某个地方,值可能会更改,如果您不知道该更改,您可能会遇到类似的问题,即不会删除数据。让我们看下面的例子。

        0 - 真 1 - 真

        现在您已将键 1 的值更改为 false。因此,当您致电map.remove(position, true) 时,将找不到任何要删除的内容。

        我建议仅使用带有键的删除功能。以下应该足够了。

        if (map.containsKey(position)) map.remove(position);
        

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-16
          • 2012-10-20
          • 2017-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多