如何修复无thirdName输入时的Java Scanner逻辑与NoSuchElementException错误
修复姓名格式化代码的问题
原代码的核心问题
- Scanner读取逻辑错误:混合使用
next()和nextLine()时,next()会停在空格处,留下换行符在输入缓冲区,后续nextLine()会读取这个空行,导致thirdName不是预期内容;当输入无空格(比如连续的名字字符串),next()会因无法读取第二个输入抛出NoSuchElementException。 - 名字顺序逻辑颠倒:原代码错误地将第二个输入当作中间名、第三个输入当作姓氏,和需求的「姓首字母 + 名 + 中间名首字母」格式不符。
- 空值判断错误:
thirdName.equals(null)永远不会成立,因为nextLine()不会返回null,空输入时它会返回空字符串而非null。
修复后的代码
import java.util.Scanner; public class LabProgram { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); // 读取整行输入,按任意数量空格分割为名字数组 String[] nameParts = scnr.nextLine().split("\\s+"); String firstName = nameParts[0]; String lastName = nameParts[nameParts.length - 1]; if (nameParts.length == 2) { // 无中间名的情况:姓首字母., 名 System.out.printf("%c., %s%n", lastName.charAt(0), firstName); } else if (nameParts.length == 3) { // 有中间名的情况:姓首字母., 名 中间名首字母. String middleName = nameParts[1]; System.out.printf("%c., %s %c.%n", lastName.charAt(0), firstName, middleName.charAt(0)); } scnr.close(); } }
修复说明
- 改用
nextLine()读取整行输入,再用split("\\s+")按任意数量空格分割成名字数组,同时兼容2个或3个名字的输入场景。 - 直接通过数组长度判断是否存在中间名:数组长度为2时无中间名,长度为3时存在中间名。
- 使用
printf简化格式化输出,避免字符串拼接的繁琐,同时保证格式准确。
内容的提问来源于stack exchange,提问作者M D
相关产品推荐
相关产品推荐

