You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Kotlin中的"Index 7 out of bounds for length 7"问题?

解决ArrayIndexOutOfBoundsException错误:列表元素与索引混淆问题

我来帮你分析并解决这个问题!你遇到的ArrayIndexOutOfBoundsException根源在于把列表的元素值当成了索引来使用,具体问题出在findNumIndex函数的循环逻辑里。

错误原因详解

看你写的这段循环代码:

for(i in list) {
    if(list[i] == searchNum) {
        indexPosition = i
    } else {
        indexPosition = -1
    }
}

这里的i是遍历列表时拿到的元素值(比如你的列表里的3、2、5...最后到7),而不是元素对应的索引位置。当循环到元素7时,你尝试执行list[7],但你的列表长度是7,合法的索引范围是0到6,这就直接触发了索引越界错误。

另外还有个隐藏问题:就算没触发越界,你的逻辑也不对——只要循环到不匹配的元素,就会把indexPosition设为-1,哪怕之前已经找到过匹配的元素,最后返回的结果也会是错误的。

修复方案

方案1:修正循环逻辑,遍历索引而非元素

把循环改成遍历列表的索引范围,这样就能正确访问对应位置的元素,并且找到目标后立即返回,避免无效循环:

fun main() { 
    val list = listOf<Int>(3, 2, 5, 1, 5, 6, 7) 
    println("The list looks like the following: $list") 
    println("Search for this number:") 
    var searchNum = readLine()?.toInt() 
    if(searchNum != null) { 
        val index = findNumIndex(list, searchNum) 
        println("The index of $searchNum is $index") 
    } 
} 

fun findNumIndex(list: List<Int>, searchNum: Int): Int { 
    // 遍历列表的索引范围(0到list.size-1)
    for(index in list.indices) { 
        if(list[index] == searchNum) { 
            return index // 找到目标立即返回,不用继续循环
        } 
    } 
    return -1 // 遍历完未找到,返回-1
}

方案2:直接使用Kotlin内置函数(更简洁)

Kotlin的List已经内置了indexOf方法,完全能实现你需要的功能——返回第一个匹配元素的索引,找不到则返回-1。用内置函数不仅代码更简洁,还能避免自己写逻辑出错:

fun main() { 
    val list = listOf<Int>(3, 2, 5, 1, 5, 6, 7) 
    println("The list looks like the following: $list") 
    println("Search for this number:") 
    // 可以加个异常处理,防止输入非数字
    val searchNum = try {
        readLine()?.toInt()
    } catch (e: NumberFormatException) {
        println("Please enter a valid integer!")
        null
    }
    searchNum?.let {
        val index = list.indexOf(it)
        println("The index of $searchNum is $index")
    } 
}

额外提示

如果你的列表里有重复元素(比如你的列表里有两个5),indexOf会返回第一个匹配的索引;如果你想找最后一个匹配的索引,可以用lastIndexOf方法。

内容的提问来源于stack exchange,提问作者User9701

火山引擎 最新活动