如何解决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




