使用Scanner在线程中接收输入遇循环异常问题求助
问题根源
你初始代码的问题出在两点:
- 重复创建Scanner:每次外层循环都新建
Scanner,当第一次输入流被终止(比如按下Ctrl+D/Z结束输入),后续的Scanner会直接判定输入流已空,导致内层循环直接跳过,进入无限打印空内容的死循环。 - 内层循环逻辑错误:
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
相关产品推荐
相关产品推荐

