在do while循环中使用Scanner.next(Pattern pattern)正确地发出问题

时间:2018-09-26 12:25:52

标签: java java.util.scanner

我有一个菜单,其中整数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及其处理验证的方式不是最熟悉。我想我的问题是,是什么导致我的其他输入无效?

1 个答案:

答案 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