Kotlin连续调用两次readln()时仅第一个能成功获取输入的问题
问题原因
该问题不属于代码逻辑错误,核心诱因是运行环境的标准输入流处理兼容问题:
readln()原生逻辑为读取输入直到遇到换行符\n,返回剔除末尾换行符的字符串,正常情况下连续两次调用可稳定读取两行输入,若遇到流提前关闭会直接抛出异常,不会返回空串。- 第二个变量读取为空的典型触发场景:旧版本IntelliJ IDEA默认控制台未开启终端模拟、Git Bash等第三方终端对JVM输入流兼容存在缺陷、部分在线Kotlin运行环境输入缓冲逻辑不符合规范。这类场景下,第一次输入按回车后,环境会错误向输入流写入一个空行,第二次输入的内容实际滞留在缓冲区未被第二个
readln()消费,最终返回空字符串。 - 若使用的Kotlin版本低于1.6.20,也可能触发
readln()本身在JVM平台的输入缓冲bug,导致后续行读取异常。
解决方案
根据运行场景选择对应处理方式:
- IntelliJ IDEA运行场景:打开对应主类的运行配置,勾选「Emulate terminal in output console(在输出控制台模拟终端)」,保存后重新运行即可恢复正常。
- 命令行运行场景:不要使用Git Bash等兼容性较差的第三方终端,更换为Windows自带的CMD/PowerShell、macOS/Linux系统自带终端执行程序。
- 通用兼容方案:显式使用
BufferedReader包装标准输入流读取内容,绕开环境自带的缓冲问题,参考代码如下:
import java.io.BufferedReader import java.io.InputStreamReader fun main() { val reader = BufferedReader(InputStreamReader(System.`in`)) val number1 = reader.readLine() val number2 = reader.readLine() println(" number 1 is $number1 number 2 is $number2") reader.close() }
- 版本修复:将Kotlin升级至1.6.20及以上稳定版本,修复早期
readln()的内置缺陷。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

