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
相关产品推荐
相关产品推荐

