Kotlin代码抛出IndexOutOfBoundsException,求错误排查与修复
问题分析与修正
错误1:输入顺序完全颠倒
根据任务要求,输入顺序是:
- 第1行:列表大小N
- 第2到N+1行:N个列表元素
- 最后1行:空格分隔的P和M
但你的代码在读取完N后,先读取了P和M,再去读取N个元素,这会导致程序把原本应该是列表第一个元素的输入当成了P和M的输入。如果这个输入只有单个数字,split(" ")会得到一个仅含1个元素的列表,此时用val (a, b)解构就会因为列表大小不足2而抛出IndexOutOfBoundsException——这就是你看到的错误原因。
错误2:判断逻辑不符合要求
题目要求P和M都在列表中才输出YES,但你用了||(逻辑或),只要其中一个存在就输出YES,这和任务要求相反,应该用&&(逻辑与)。
修正后的代码
fun main() { val size = readln().toInt() val mutList: MutableList<Int> = mutableListOf() // 先读取N个列表元素 for (i in 0 until size) { mutList.add(readln().toInt()) } // 最后读取P和M val (a, b) = readln().split(" ") val p = a.toInt() val m = b.toInt() // 用逻辑与判断两者都存在 if (p in mutList && m in mutList) { println("YES") } else { println("NO") } }
额外优化建议
- 可以不用MutableList,直接用List:
val list = List(size) { readln().toInt() },更简洁高效。 - 解构时可以直接转Int:
val (p, m) = readln().split(" ").map { it.toInt() },减少中间变量。
优化后的简洁版本:
fun main() { val size = readln().toInt() val list = List(size) { readln().toInt() } val (p, m) = readln().split(" ").map(String::toInt) println(if (p in list && m in list) "YES" else "NO") }
内容的提问来源于stack exchange,提问作者dobetterds
相关产品推荐
相关产品推荐

