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

使用Scanner在线程中接收输入遇循环异常问题求助

问题根源

你初始代码的问题出在两点:

  1. 重复创建Scanner:每次外层循环都新建Scanner,当第一次输入流被终止(比如按下Ctrl+D/Z结束输入),后续的Scanner会直接判定输入流已空,导致内层循环直接跳过,进入无限打印空内容的死循环。
  2. 内层循环逻辑错误:while(sc.hasNextLine())会持续读取输入直到整个输入流结束,而非完成单次输入后就输出结果,完全不符合“持续输入-输出”的预期。
解决办法

需求1:每次输入一行就输出

如果只是想输入一行就立刻打印,直接简化代码,只创建一次Scanner,去掉多余的内层循环:

new Thread(() -> {
    Scanner sc = new Scanner(System.in); // 仅初始化一次
    while (true) {
        System.out.println("请输入要输出的文本:");
        String input = sc.nextLine();
        System.out.println(input);
    }
}).start();

需求2:支持多行输入,空行结束

如果需要输入多行文本,输完按空行结束并打印,同样复用单个Scanner,用空行作为终止标志:

new Thread(() -> {
    Scanner sc = new Scanner(System.in);
    while (true) {
        StringBuilder builder = new StringBuilder();
        System.out.println("请输入要输出的文本(输空行结束):");
        while (true) {
            String line = sc.nextLine();
            if (line.isEmpty()) { // 空行作为单次输入的结束
                break;
            }
            builder.append(line).append("\n"); // 保留每行的换行格式
        }
        System.out.println("你输入的内容:\n" + builder);
    }
}).start();

核心要点

  • 复用Scanner实例:仅初始化一次,避免重复打开输入流导致的异常。
  • 采用空行作为单次输入终止条件:无需自定义特殊符号,符合常规输入习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:45:49