Java使用Scanner限制用户禁止输入数字时无法触发提示的问题咨询
问题原因
- 代码逻辑顺序错误:你已经先通过
scanner.nextLine()读取了用户输入的整行内容,Scanner的读取指针会移动到当前输入行的末尾,后续调用scanner.hasNextDouble()时会等待用户输入新的内容,不会基于已经读取的userName做校验,所以永远无法触发你写的提示逻辑。 - 方法本身不匹配需求:
scanner.hasNextDouble()只能判断用户的输入整体是不是可解析为数字的格式,如果用户输入的是李4这种文字加数字的混合内容,就算逻辑顺序没错,也不会触发提示,本身就不符合姓名不能包含任何数字的要求。
可行实现方案
方案1:正则校验已读取的姓名字符串(最推荐)
直接对已经拿到的userName做内容校验,判断是否包含数字即可,示例代码如下:
import java.util.Scanner; public class NameValidator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter your name:"); String userName = scanner.nextLine(); // 正则规则:.*匹配任意字符,\\d匹配数字,只要字符串包含数字就命中校验 if (userName.matches(".*\\d.*")) { System.out.println("You can't enter numbers"); } // 如果需要更严格的姓名格式校验,比如只能输入中英文和空格,可以替换为以下判断 // if (!userName.matches("^[a-zA-Z\\u4e00-\\u9fa5\\s]+$")) { // System.out.println("姓名只能包含中英文和空格,不能输入数字或特殊符号"); // } scanner.close(); } }
方案2:调整Scanner方法调用顺序(不推荐,仅做参考)
如果要保留hasNextDouble()的写法,要先做判断再读取内容,但是该方案无法识别混合了文字和数字的输入:
import java.util.Scanner; public class NameValidator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter your name:"); if (scanner.hasNextDouble()) { System.out.println("You can't enter numbers"); scanner.next(); // 读取掉输入的数字,避免缓存残留 } else { String userName = scanner.nextLine(); } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Alex2123
相关产品推荐
相关产品推荐

