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

Kotlin使用readLine读取字符串输入时出现运行时错误求助

错误原因

报错的核心是你混用了java.util.Scanner和Kotlin原生readLine()两套标准输入读取API,二者的缓冲区机制不兼容:

  • Scanner.nextInt()只会读取匹配整数的字符,不会自动消费整数后方的换行符,且Scanner会提前将部分输入内容读取到自身内部缓冲区,不会同步给底层输入流
  • 后续调用readLine()时,要么读到上一次整数读取残留的空换行,要么因为底层流内容已经被Scanner预读走,直接读到流末尾返回null,代码里的非空断言!!碰到null就会直接抛出KotlinNullPointerException
修复方案

二选一即可,核心原则是同一套输入逻辑里只使用一种输入API,不要混用:

  • 方案1:全程使用Scanner完成输入读取
    修复后代码如下,注意读完整数后要手动消费残留的换行符,再读取目标字符串:
    import java.util.*
    fun main(args: Array<String>) {
        val inp = Scanner(System.`in`)
        val t: Int = inp.nextInt()
        repeat(t) {
            val n: Int = inp.nextInt()
            // 消费nextInt()遗留的换行符
            inp.nextLine()
            val s: String = inp.nextLine()
            for (i in s) {
                println(i)
            }
            println()
        }
    }
    
    如果要读取的字符串不含空格,可以直接用inp.next()读取,该方法会自动跳过前置空白符,不需要额外消费换行。
  • 方案2:全程使用Kotlin原生readLine()完成输入读取
    完全弃用Scanner,所有输入通过readLine()读取后手动转换为需要的类型,不存在缓冲区冲突问题:
    fun main(args: Array<String>) {
        val t = readLine()!!.toInt()
        repeat(t) {
            val n = readLine()!!.toInt()
            val s = readLine()!!
            for (i in s) {
                println(i)
            }
            println()
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:36:14