正确使用 Scanner.next(模式模式) 在循环中执行的问题



我有一个菜单,其中整数 0 到 6 有不同的操作。 如果用户输入正确,它将成功执行该操作,并再次请求输入以执行下一个操作。 要退出程序菜单,用户输入必须为 6。 如果收到任何无效输入,它将打印"无效选项"并重新打印再次请求输入。 我的代码是:

int menuSelection;
Scanner reader = new Scanner(System.in);  // Reading from System.in
do
{
System.out.println("Enter a number: ");
if (reader.hasNext(Pattern.compile("^[0-6]$")))
{
menuSelection = reader.nextInt();
}
else
{
System.out.println("Invalid option");
reader.next();
}
} while(menuSelection != 6);
//once finished
reader.close();

我的输出是:

Enter a number: 
1
Enter a number: 
2
Invalid option
Enter a number: 
3
Invalid option
Enter a number: 
4
Invalid option
Enter a number: 
5
Invalid option
Enter a number: 
6
Invalid option
Enter a number: 
7
Invalid option
Enter a number: 
8
Invalid option
Enter a number: 
pancake
Invalid option
Enter a number: 

所以它正确地处理了我给它的第一个输入,但在那之后,它陷入了无限循环,因为它总是认为我的输入不正确。我在这里的逻辑是,只要menuSelection不是 6,它总是重复,因为这是程序唯一一次退出,其他一切都应该循环回等待输入。因此,在 do while 循环中,我希望我可以在那里进行错误检查,确保输入在 0-6 的范围内,并且也是严格的整数类型,否则再次通过循环而不执行操作(实际上尚未编码到 if 块中(。

我对Java很陌生,所以我不是最熟悉Scanner以及它如何处理验证的人。我想我的问题是,是什么导致我的其他输入无效?

检查您的正则表达式。尝试:

if (reader.hasNext(Pattern.compile("[0-6]"))) {
menuSelection = reader.nextInt();
}

这意味着,当检测到模式[0-6](0 到 6 之间的任何数字(时,它会按预期工作。

[编辑]

按照cricket_007的建议,我最后删除了{1}(只有一次(。

[/编辑]

例:

Enter a number: 
sdf
Invalid option
Enter a number: 
3
Enter a number: 
2
Enter a number: 
1
Enter a number: 
5
Enter a number: 
8
Invalid option
Enter a number: 
6

最新更新