假设我想让这个代码让用户选择三只动物中的一只(狗,猫,猪),然后让计算机回复动物发出的任何声音(即“狗” - >“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")
}
答案 0 :(得分:0)
!animal.equalsIgnoreCase("dog")
表示"动物不等于dog
"。当您输入dog
时,此条件为false
,因为动物等于dog
。
||
运算符是一个短路运算符,这意味着只有在我们无法从左侧得到答案时才会评估右侧。因此当左侧是true
(动物不等于dog
)时,我们可以在那里停下来。但是当左侧是假的(动物等于dog
)时,我们需要检查下一个条件,看看它是否为真。在您的情况下,该"动物不等于cat
"。由于dog
不等于cat
,这是正确的,并且您的代码打印出"That isn't a valid animal."
最简单的解决方法是将||
更改为&&
,但真正的问题是!a && !b
违反直觉。你的情况是"动物不等于dog
,cat
或pig
",所以你可以把它写成:
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();
}