从while循环继续到if语句

时间:2017-09-20 22:47:06

标签: java if-statement while-loop

假设我想让这个代码让用户选择三只动物中的一只(狗,猫,猪),然后让计算机回复动物发出的任何声音(即“狗” - >“woof”)。但是,我希望能够阻止用户使用while语句输入任何其他不是狗,猫或猪的动物。

当我这样做时,while语句会运行并循环,但是如果你输入“dog”,它仍会打印“那不是一个有效的动物。”,当我希望它继续下面的if语句时。造成这种情况的原因是什么?

String animal = keyboard.nextLine();

  while (!animal.equalsIgnoreCase("dog")||!animal.equalsIgnoreCase("cat")||!animal.equalsIgnoreCase("pig")) {
            System.out.println("That isn't a valid animal.");
            animal = keyboard.nextLine();
  }
        if (animal.equals("dog"){
        System.out.println("Woof")
        }

3 个答案:

答案 0 :(得分:0)

!animal.equalsIgnoreCase("dog")表示"动物不等于dog"。当您输入dog时,此条件为false,因为动物等于dog

||运算符是一个短路运算符,这意味着只有在我们无法从左侧得到答案时才会评估右侧。因此当左侧是true(动物不等于dog)时,我们可以在那里停下来。但是当左侧是假的(动物等于dog)时,我们需要检查下一个条件,看看它是否为真。在您的情况下,该"动物不等于cat"。由于dog不等于cat,这是正确的,并且您的代码打印出"That isn't a valid animal."

最简单的解决方法是将||更改为&&,但真正的问题是!a && !b违反直觉。你的情况是"动物不等于dogcatpig",所以你可以把它写成:

while( !( animal.equalsIgnoreCase("dog") || animal.equalsIgnoreCase("cat") || animal.equalsIgnoreCase("pig") ))

答案 1 :(得分:0)

让我们采取这种逻辑

!animal.equalsIgnoreCase("dog") || !animal.equalsIgnoreCase("cat")

这可以表示为NOT(dog) OR NOT(cat)

好吧,如果 是狗,那么不是一只猫。这使得陈述成立。反之亦然。

如果你输入任何东西,这句话也是如此,因为它不是狗或猫。

相反,您想要撰写NOT (dog OR cat)NOT(dog) AND NOT(cat)

或者,您可以使用while(true)

while (true) {
    String animal = keyboard.nextLine();
    switch (animal) {
       case "dog":
         System.out.println("Woof");
         break;
       case "cat":
         break;
       default:
         System.out.println("That isn't a valid animal.");
    }
}

答案 2 :(得分:0)

我会创建一组可接受的值,这样就可以轻松添加更多动物,而无需在while循环中添加更多逻辑语句

HashSet<String> validAnimals = new HashSet<>();
validAnimals.add("dog");
validAnimals.add("cat");
validAnimals.add("pig");
//easy to add more valid animals

String input = keyboard.nextLine();

//only have to call contains() on the set
while(!validAnimals.contains(input.toLowerCase()))
{
    System.out.println("That isn't a valid animal.");
    input = keyboard.nextLine();
}