You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:57:11