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

Java按空格拆分字符串程序空行输入时无法终止问题排查

解决Java程序输入空行无法终止及相关问题

我来帮你分析下代码里的问题,以及对应的修复方案:

你的代码存在的几个关键问题:

1. Scanner对象在循环内重复创建

你每次循环都新建Scanner scanner = new Scanner(System.in);,这会导致输入流被多次初始化,不仅浪费资源,还会干扰输入读取逻辑——当你输入空行时,新创建的Scanner可能无法正确识别这个终止信号,因为输入流的状态已经被之前的Scanner实例占用了。正确的做法是整个程序只使用一个Scanner实例,把它的创建放在循环外面。

2. 空行终止判断的位置错误

现在你是先拆分输出输入内容,再判断是否是空行。这意味着输入空行时,程序会先把空字符串拆分成包含空元素的数组,输出一个空行后才终止。如果你的需求是输入空行直接终止、不输出任何内容,应该先判断是否为空行,再执行拆分输出操作。

3. split(" ")的潜在问题

用split(" ")拆分字符串时,若输入有多个连续空格,会生成空字符串元素(比如输入"hello world"会拆成["hello", "", "", "world"]),输出时会出现多余的空行;另外字符串开头或结尾的空格也会产生空元素,不符合逐行输出有效单词的预期。

修正后的代码

import java.util.Scanner;

public class LineByLine {
    public static void main(String[] args) {
        // 仅创建一次Scanner实例,复用输入流
        Scanner scanner = new Scanner(System.in);
        
        while (true) {
            String sentence = scanner.nextLine();
            
            // 先判断空行,直接终止循环
            if (sentence.isEmpty()) {
                break;
            }
            
            // 用\\s+匹配一个或多个空白字符,避免生成空元素
            String[] pieces = sentence.split("\\s+");
            
            // 用增强for循环简化遍历逻辑
            for (String piece : pieces) {
                System.out.println(piece);
            }
        }
        
        // 关闭Scanner释放资源
        scanner.close();
    }
}

代码说明:

  • 将Scanner放在循环外,确保整个程序使用同一个输入流读取器,避免流冲突问题。
  • 先判断输入行是否为空,为空则直接终止循环,跳过后续的拆分输出逻辑。
  • 使用split("\\s+")代替split(" "):\\s是正则表达式中匹配任意空白字符的元字符,+表示匹配一次或多次,这样不管有多少个连续空格,都会被当作一个分隔符,不会生成空元素,同时也能处理制表符等其他空白字符。
  • 最后关闭Scanner,养成良好的资源释放习惯。

这样修改后,程序就能正常在输入空行时终止,同时也能正确处理各种空格情况啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:30:53