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

Java Scanner如何读取含空格的完整字符串且不读取整行?

解决Scanner读取带空格姓名的问题

你的问题出在Scanner.next()默认按任意空白分割,导致带空格的姓名被拆分成多个元素,错误设置分隔符又触发了NoSuchElementException。以下是两种可靠的解决方案:

方法一:逐行读取后拆分(推荐)

先读取整行内容,再通过正则分割,将最后两个元素作为年龄和性别,前面的内容拼接为姓名(兼容单/多字姓名):

while (reader.hasNextLine()) {
    String line = reader.nextLine().trim();
    // 以一个或多个空白字符分割行内容
    String[] parts = line.split("\\s+");
    
    // 拼接姓名(前面所有非年龄、性别的部分)
    StringBuilder nameBuilder = new StringBuilder();
    for (int j = 0; j < parts.length - 2; j++) {
        if (j > 0) nameBuilder.append(" ");
        nameBuilder.append(parts[j]);
    }
    
    String age = parts[parts.length - 2];
    String gender = parts[parts.length - 1];
    result[i++] = new Person(nameBuilder.toString(), age, gender);
}

方法二:自定义Scanner分隔符

通过正则表达式设置分隔符,让Scanner把姓名作为一个整体读取,避免拆分:

// 分隔符规则:一个或多个空白,且后面紧跟数字(年龄)或性别词
reader.useDelimiter("\\s+(?=\\d|male|female)");

while (reader.hasNext()) {
    String name = reader.next().trim();
    // 临时切换分隔符为任意空白,读取年龄和性别
    reader.useDelimiter("\\s+");
    String age = reader.next();
    String gender = reader.next();
    
    result[i++] = new Person(name, age, gender);
    
    // 重置分隔符,处理下一行的姓名
    reader.useDelimiter("\\s+(?=\\d|male|female)");
    // 跳过换行符,避免干扰下一次读取
    if (reader.hasNextLine()) {
        reader.nextLine();
    }
}

为什么之前的代码报错?

你直接设置分隔符为单个空格" ",但文件中是多个连续空格,且循环中reader.nextLine()会跳过剩余的空白字符,导致后续next()无法找到有效元素,触发NoSuchElementException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:56:06