Java姓名输入验证需重复输入两次问题求助
问题排查与修复:输入姓名需重复输入的问题
你的问题根源在于重复调用Scanner.next()方法——每次调用这个方法都会从输入流中读取一个新的字符串,而你没有把读取到的值存储起来复用,导致输入的内容被多次“消耗”,所以需要输入两次才能通过验证。
原代码的问题拆解
我们来逐行梳理你的代码逻辑,就能清楚看到问题所在:
System.out.println("Enter First Name"); // 第一次调用in.next(),读取用户输入的第一个姓名并设置到对象中 queueArray[last].setfName(in.next().toUpperCase()); // 第二次调用in.next(),读取用户输入的第二个内容,用它来做匹配判断 while(!in.next().matches("[a-zA-Z,]+")){ System.out.println("Invalid Input"); System.out.println("Enter First Name"); // 第三次调用in.next(),读取用户输入的第三个内容,再次设置到对象中 queueArray[last].setfName(in.next().toUpperCase()); }
你看,用户第一次输入的姓名被直接设置到了对象里,但紧接着while条件又去读取下一个输入来验证,这时候验证的根本不是第一次输入的内容;如果验证不通过,循环里又会读取新的输入来设置,整个流程完全错位,自然需要多次输入才能推进。
修复后的代码
正确的做法是:先把用户输入的内容存储到一个变量中,然后基于这个变量做验证和后续操作,避免重复读取输入流。
System.out.println("Enter First Name"); // 先读取输入并存储到变量 String firstName = in.next().toUpperCase(); // 验证变量中的内容,不符合要求就重新读取并更新变量 while (!firstName.matches("[a-zA-Z,]+")) { System.out.println("Invalid Input"); System.out.println("Enter First Name"); firstName = in.next().toUpperCase(); } // 验证通过后,再把变量的值设置到对象中 queueArray[last].setfName(firstName);
额外优化建议
- 你的正则表达式
[a-zA-Z,]+允许输入逗号,如果你只是想允许纯字母(包括大小写),可以改成[a-zA-Z]+;如果要支持带空格的姓名(比如“Mary Ann”),可以调整为[a-zA-Z\\s]+。 - 若需要读取整行输入(包含空格),可以考虑用
Scanner.nextLine()代替next(),next()只会读取到空格为止,而nextLine()能读取用户输入的一整行内容。
内容的提问来源于stack exchange,提问作者uzumaki_jenki
相关产品推荐
相关产品推荐

