猿问

在 do while 循环中正确使用 Scanner.next(Pattern pattern)

我有一个菜单,其中整数零到六有不同的操作。如果用户输入正确,它会成功执行操作并再次要求输入以执行下一个操作。要退出程序菜单,用户输入必须为 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: 

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


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


胡说叔叔
浏览 196回答 1
1回答

慕斯王

检查您的正则表达式。尝试:if (reader.hasNext(Pattern.compile("[0-6]"))) {    menuSelection = reader.nextInt();}这意味着,当检测到模式[0-6](0 到 6 之间的任何数字)时,它会按您的预期工作。[编辑]正如cricket_007建议的那样,我最后删除了{1}(仅一次)。[/编辑]例子:Enter a number: sdfInvalid optionEnter a number: 3Enter a number: 2Enter a number: 1Enter a number: 5Enter a number: 8Invalid optionEnter a number: 6
随时随地看视频慕课网APP

相关分类

Java
我要回答