Java 正确使用Scanner.next(模式)执行do while循环时出现问题
我有一个菜单,从0到6的整数有不同的动作。 如果其中一个用户输入正确,它将成功执行该操作,并再次请求输入以执行下一个操作。 要退出程序菜单,用户输入必须为6。 如果收到任何无效输入,它将打印“无效选项”,并重新打印请求输入。 我的代码是:Java 正确使用Scanner.next(模式)执行do while循环时出现问题,java,java.util.scanner,Java,Java.util.scanner,我有一个菜单,从0到6的整数有不同的动作。 如果其中一个用户输入正确,它将成功执行该操作,并再次请求输入以执行下一个操作。 要退出程序菜单,用户输入必须为6。 如果收到任何无效输入,它将打印“无效选项”,并重新打印请求输入。 我的代码是: int menuSelection; Scanner reader = new Scanner(System.in); // Reading from System.in do { System.out.println("Enter a numbe
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:
我得到的结果是:
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,它总是重复,因为这是程序唯一会退出的时间,其他一切都应该返回到等待输入。因此,在do while循环中,我希望我可以在那里进行错误检查,确保输入在0-6的范围内,并且是严格的整数类型,否则在不执行操作的情况下再次通过循环(实际上还没有编码到if块中)
我对Java相当陌生,所以我对Scanner及其如何处理验证不是最熟悉。我想我的问题是,是什么导致我的其他输入无效?检查您的正则表达式。尝试:
if (reader.hasNext(Pattern.compile("[0-6]"))) {
menuSelection = reader.nextInt();
}
这意味着,当检测到模式[0-6]
(0和6之间的任何数字)时,它将按照您的预期工作
[编辑]
我在最后删除了{1}
(只有一次),就像cricket_007建议的那样
[/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
hasNext()
正在检查下一个令牌而不是当前值!你是对的,但是由于扫描仪的起始值是零,下一个值就是用户刚刚输入的,并且还没有被消费的值。哇!非常感谢你!它就像一个符咒!你能告诉我更多的细节吗?我认为用^[0-6]$means限制我的正则表达式,确保[0-6]中的字符是第一个字符,并且$means是输入的结尾,这样字符后面就不会出现更多的东西。简言之,我认为它做的事情与用{1}{1}
检查一个字符是多余的一样here@cricket_007谢谢,我不知道。也许你可以解释一下为什么以前的正则表达式^[0-6]$
不起作用?@Game我相信模式。compile
为you@GarfieldTong