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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:42:34