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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:48:47