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

