如何解决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
相关产品推荐
相关产品推荐

