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

Kotlin遍历字符串报String index out of range:12错误如何解决?

报错触发原因
  • 循环范围定义不合法:Kotlin中..运算符生成的是闭区间,0..testStr.length会覆盖从0到字符串长度的所有整数,但字符串的合法索引范围是0 ~ testStr.length - 1,仅该范围定义本身就存在越界风险。
  • 循环过程中修改了目标字符串长度:循环的遍历范围是在循环启动前,基于初始testStr的长度计算完成的,不会随字符串修改动态调整。但你在循环体中每次调用dropLast(1)都会缩短字符串长度,当循环索引i超过当前字符串的最大合法索引时,就会抛出索引越界异常,本次触发的索引12报错就是该原因导致。
  • 业务逻辑存在瑕疵:当前逻辑是每次删除字符串末尾字符,就算匹配到/也会再执行一次删末尾操作,最终会把目标/一并删除,不符合常规的截断需求。
正确实现方案

如果你的需求是截取字符串中第一个/之前的内容,Kotlin有原生API可以直接实现,无需手动遍历:

方案1:使用内置函数实现(推荐)

保留/的实现:

fun main() {
    val testStr = "subject1EE/Physics - 101"
    val result = testStr.takeWhile { it != '/' } + "/"
    println(result) // 输出:subject1EE/
}

不保留/的实现:

fun main() {
    val testStr = "subject1EE/Physics - 101"
    val result = testStr.takeWhile { it != '/' }
    println(result) // 输出:subject1EE
}

方案2:手动遍历实现(适合学习原理)

不要在遍历过程中修改原字符串,先找到/的索引再统一截断:

fun main() {
    val testStr = "subject1EE/Physics - 101"
    var slashIndex = -1
    // 使用until生成左闭右开区间,覆盖所有合法索引
    for (i in 0 until testStr.length) {
        if (testStr[i] == '/') {
            slashIndex = i
            break
        }
    }
    val result = if (slashIndex != -1) {
        // 要保留/就截取到slashIndex+1,不保留就截取到slashIndex
        testStr.substring(0, slashIndex + 1)
    } else {
        testStr // 未找到/时返回原字符串
    }
    println(result)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:12:02