Java 正确使用Scanner.next(模式)执行do while循环时出现问题

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

我有一个菜单,从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: 
我得到的结果是:

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