为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡说叔叔 2021-10-13 11:03:31
我有一个菜单,其中整数零到六有不同的操作。如果用户输入正确,它会成功执行操作并再次要求输入以执行下一个操作。要退出程序菜单,用户输入必须为 6。如果收到任何无效输入,它会打印“无效选项”并重新打印要求输入。我的代码是:int menuSelection;Scanner reader = new Scanner(System.in);  // Reading from System.indo{    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 finishedreader.close();我的输出是:Enter a number: 1Enter a number: 2Invalid optionEnter a number: 3Invalid optionEnter a number: 4Invalid optionEnter a number: 5Invalid optionEnter a number: 6Invalid optionEnter a number: 7Invalid optionEnter a number: 8Invalid optionEnter a number: pancakeInvalid optionEnter a number: 所以它正确地处理了我给它的第一个输入,但在那之后,它陷入了无限循环,因为它总是认为我的输入不正确。我的逻辑是有一个 do while 只要menuSelection不是 6就总是重复,因为这是程序将永远退出的唯一时间,其他一切都应该循环回到等待输入。所以然后在 do while 循环中我希望我可以在那里进行错误检查,确保输入在 0-6 的范围内并且也是严格的整数类型,否则在不执行操作的情况下再次通过循环(这不是t 实际上已编码到 if 块中)。我对 Java 还很陌生,所以我不是最熟悉 Scanner 以及它如何处理验证的人。我想我的问题是,是什么导致我的其他输入无效?
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

检查您的正则表达式。尝试:


if (reader.hasNext(Pattern.compile("[0-6]"))) {

    menuSelection = reader.nextInt();

}

这意味着,当检测到模式[0-6](0 到 6 之间的任何数字)时,它会按您的预期工作。


[编辑]


正如cricket_007建议的那样,我最后删除了{1}(仅一次)。


[/编辑]


例子:


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


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信