我有一个菜单,其中整数0到6具有不同的作用。 如果一个用户输入正确,它将成功执行该操作,然后再次请求输入以执行下一个操作。 要退出程序菜单,用户输入必须为六个。 如果收到任何无效的输入,它将打印“ invalid option”,然后重新打印以要求再次输入。 我的代码是:
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及其处理验证的方式不是最熟悉。我想我的问题是,是什么导致我的其他输入无效?
答案 0 :(得分:1)
检查您的RegEx。试试:
if (reader.hasNext(Pattern.compile("[0-6]"))) {
menuSelection = reader.nextInt();
}
这意味着,当检测到模式[0-6]
( 0到6之间的任何数字)时,它将按您期望的那样工作。
[编辑]
我按照 cricket_007 的建议,最后删除了{1}
(一次)。
[/ edit]
示例:
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