java - Kotlin 中 for 循环的 IndexOutOfBoundsException

标签 java list arraylist kotlin indexoutofboundsexception

我在 Kotlin 中有两个相同大小的列表,foodObjects: MutableList<ParseObject>?checked: MutableList<Boolean>? .我需要做一个 for循环并得到 objectId来自 foodObjects每次 checked 的一个元素是真的。所以在 Java 中是这样的:

for (int i = 0; i < foodObjects.size(); i++) {
    // here
}

但是在Kotlin中,不知道为什么,出现了一些问题。事实上,如果我这样做:

for (i in 0..foodObjects!!.size) {
    if (checked?.get(i) == true) {
        objectsId?.add(foodObjects.get(i).objectId)
    }
}

我有 IndexOutOfBoundsException .我不知道为什么,它还在 foodObjects.size 继续循环.我也可以用 filter 来做和 map :

(0..foodObjects!!.size)
    .filter { checked?.get(it) == true }
    .forEach { objectsId?.add(foodObjects.get(it).objectId) }

但我遇到了同样的错误。我用它来停止错误并让它工作:

for (i in  0..foodObjects!!.size) {
    if (i < foodObjects.size) {
        if (checked?.get(i) == true) {
            objectsId?.add(foodObjects.get(i).objectId)
        }
    }
}

每个人都可以告诉我为什么在 Kotlin 中我需要这样做,而在 Java 中它却能很好地工作?

最佳答案

Kotlin 中的范围是包容性的,因此 0..foodObjects!!.size0 开始到 foodObjects.size 结束,包括两端。当您的循环尝试使用自己的大小(比最大有效索引多一个)索引列表时,这会导致异常。

要创建不包括上限的范围(如您的 Java 循环),您可以使用 until :

for(i in 0 until foodObjects!!.size) {
    // ...
}

如果您对预先使用的集合进行空检查,您还可以稍微清理一下代码:

if (foodObjects != null && checked != null && objectsId != null) {
    for (i in 0 until foodObjects.size) {
        if (checked.get(i) == true) {
            objectsId.add(foodObjects.get(i).objectId)
        }
    }
}
else {
    // handle the case when one of the lists is null
}

为了完全摆脱必须处理索引的麻烦,您可以使用 indices列表的属性(另外我在这里使用索引运算符而不是 get 调用):

for (i in foodObjects.indices) {
    if (checked[i]) {
        objectsId.add(foodObjects[i].objectId)
    }
}

你也可以使用 forEachIndexed :

foodObjects.forEachIndexed { i, foodObject ->
    if (checked[i]) {
        objectsId.add(foodObject.objectId)
    }
}

关于java - Kotlin 中 for 循环的 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45321344/

相关文章:

java - Java SWT 的无效线程访问错误

python - 使用 Python 将字典键分配给给定列表

python - 遍历数组查看多个值

java - ArrayList 已初始化,但在尝试 .add(string) 方法时仍返回 NullPointerException

java-如何管理多个数据列表-在单个变量中-轻松访问每个列表

java - 从循环(Arraylist)和几个单独的标志到mysql命令行制作一个字符串

java - 无法将 getNamedQuery 结果转换为表类

java - Hyperjaxb 3导入XSD和persistence.xml

java - Spring Rest ErrorHandling @ControllerAdvice/@Valid

Python LIST 函数不返回新列表