Kotlin中如何实现安全数组遍历避免下标越界异常
Kotlin 实现数组循环防越界的等价方案
问题本质
你当前使用的forEachIndexed会遍历数组从0到x.lastIndex(即数组长度-1)的所有下标,当遍历到最后一个元素时访问x[index+1]必然超出数组下标范围触发崩溃,和你预期的「循环上界为数组长度-1、仅遍历到倒数第二个元素」的逻辑不匹配。
可用实现方式
以下几种写法都能实现和你原有循环逻辑完全一致的边界控制效果,不会触发数组下标越界:
- 基础for循环写法(最贴近原Java逻辑)
用Kotlin的until关键字定义左闭右开区间,完全对应原循环的i < x.length - 1判断逻辑:val x = doubleArrayOf(0.0, 0.23, 0.46, 0.69, 0.92, 1.15, 1.38, 1.61) val output = mutableListOf<Double>() // 0 until x.size -1 表示i的取值范围是0到x.size-2,不会取到最后一个元素下标 for (i in 0 until x.size - 1) { output.add((x[i + 1] - x[i]) * 10) } - 函数式写法(无需手动控制下标)
用Kotlin标准库的windowed滑动窗口扩展函数,自动按连续2个元素分组,从根源上避免下标写错的问题:val output = x .asList() .windowed(size = 2) // 每次取相邻两个元素,自动停在倒数第二个元素位置 .map { (current, next) -> (next - current) * 10 } - 改造现有forEachIndexed写法
如果需要保留现有forEachIndexed的代码结构,直接在逻辑里跳过最后一个元素即可:x.forEachIndexed { index, _ -> if (index == x.lastIndex) return@forEachIndexed // 最后一个元素直接终止本次遍历 output.add((x[index + 1] - x[index]) * 10) }
结果验证
用你提供的测试数组运行上述任意一种代码,最终输出结果为:
[2.3, 2.3000000000000003, 2.3, 2.3000000000000003, 2.3, 2.3, 2.3]
符合相邻元素差值乘10的计算预期,无越界崩溃。
内容的提问来源于stack exchange,提问作者Bob Redity
相关产品推荐
相关产品推荐

