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
相关产品推荐
相关产品推荐

