【问题标题】:Issues properly using Scanner.next(Pattern pattern) in do while loop在 do while 循环中正确使用 Scanner.next(Pattern pattern) 的问题
【发布时间】:2018-09-26 12:25:51
【问题描述】:

我有一个菜单,其中从 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 的范围内并且也是严格的整数类型,否则在不执行操作的情况下再次通过循环(这不是t 实际上已经编码到 if 块中了)。

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

【问题讨论】:

  • hasNext() 正在检查下一个令牌而不是当前值!
  • 你是对的,但是由于扫描仪从 no value 开始,next value 是用户刚刚输入的值,并且没有'没有被消耗。

标签: java java.util.scanner


【解决方案1】:

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

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

【讨论】:

  • 哇!太感谢了!它就像一个魅力!你能不能给我更详细一点的原因?我虽然用 ^[0-6]$ 限制我的正则表达式的意思是,确保 [0-6] 内的字符是第一个字符,而 $ 表示输入的结束,因此字符之后不会出现更多内容。简而言之,我认为它与使用 {1} 检查一个字符的作用相同
  • {1} 在这里是多余的
  • @cricket_007 谢谢,没有意识到这一点。也许您可以解释为什么以前的正则表达式^[0-6]$ 不起作用?
  • @Game 我相信Pattern.compile 会为你插入这些字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多