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

如何解决Kotlin控制台读取同行双输入时的数组越界崩溃问题

问题根因

原有实现存在两个疏漏:

  • 没有把/exit的判断逻辑放在输入拆分之前,输入/exit时会被拆成长度为1的数组,直接取下标1就会触发数组越界
  • 没有对split后的数组长度做合法性校验,用户漏输第二个参数时也会直接崩溃
解决方案

核心思路:把退出指令判断逻辑放在输入拆分之前,先拦截/exit操作,再校验正常输入的格式合法性,从根源避免数组越界。

实现要点

  • 读取输入后先做空值和前后空白处理,避免无效空格、回车等异常输入导致崩溃
  • 优先匹配/exit指令,匹配到直接终止程序,不进入后续拆分逻辑
  • 用正则\\s+拆分输入,适配用户输入多个空格分隔参数的场景
  • 拆分后先校验数组长度是否为2,不符合则提示格式错误要求重新输入,不直接访问数组下标
  • 额外增加参数合法性校验,避免非数字、进制超出2-36范围等异常输入导致崩溃
完整可运行代码示例
fun main() {
    while (true) {
        // 第一层输入:源进制+目标进制
        print("请按格式输入两个数字:{源进制} {目标进制}(输入/exit可退出)> ")
        val input = readLine()?.trim() ?: continue // 空输入、回车直接重试
        // 优先处理退出指令
        if (input == "/exit") {
            println("程序已退出")
            return
        }
        // 按任意数量空格拆分输入
        val parts = input.split(Regex("\\s+"))
        // 校验参数数量
        if (parts.size != 2) {
            println("输入格式错误,请输入两个用空格分隔的进制数,或输入/exit退出")
            continue
        }
        // 校验进制参数合法性
        val sourceRadix = parts[0].toIntOrNull()
        val targetRadix = parts[1].toIntOrNull()
        if (sourceRadix == null || targetRadix == null || sourceRadix !in 2..36 || targetRadix !in 2..36) {
            println("进制必须是2-36之间的整数,请重新输入")
            continue
        }
        // 第二层输入:待转换数值
        print("请输入要转换为${targetRadix}进制的${sourceRadix}进制数(输入/back可返回上一级)> ")
        val numInput = readLine()?.trim() ?: continue
        if (numInput == "/back") continue
        // 校验待转换数值合法性
        val num = numInput.toBigIntegerOrNull(sourceRadix)
        if (num == null) {
            println("输入的数字不符合${sourceRadix}进制规范,请重新输入")
            continue
        }
        // 输出转换结果
        println("转换结果:${num.toString(targetRadix).uppercase()}")
    }
}

内容的提问来源于stack exchange,提问作者Tibor Tóth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04