为什么即使条件为false,我的while循环仍在运行?

时间:2020-02-14 01:18:35

标签: java while-loop infinite-loop

我想创建一个测验,给出一个错误消息,如果用户输入的(答案变量)不等于“ A”,“ B”,“ C”,“ D”或“ E”,则该答案无效”,然后再次询问该问题以寻求新的输入。即使答案确实等于“ A”,“ B”,“ C”,“ D”或“ E”,while循环仍会运行,并且我很难弄清原因。任何帮助将不胜感激。非常感谢。

zIndex

3 个答案:

答案 0 :(得分:2)

不是A或不是B或不是C或不是D或不是E在逻辑上等效于A和B以及C以及D和E。(德摩根定律)您要不是A和Not B而不是C和Not D和Not C

答案 1 :(得分:2)

您有两个问题。

首先,您的情况不正确。如果要检查答案是否为允许的任何值,则您的条件应为以下任意一种:

!answer.equals("A") && !answer.equals("B") 
    && !answer.equals("C") && !answer.equals("D")
    && !answer.equals("E")

!(answer.equals("A") || answer.equals("B") 
    || answer.equals("C") || answer.equals("D")
    || answer.equals("E"))

有关说明,请参见Matthew's answer

第二,您递归地调用Quiz.ask(Question),即使用户在随后的调用中提供了正确的答案,也使循环继续在无效的答案上运行(请继续阅读并了解递归调用的工作方式-特别是如何管理局部变量)。 解决此问题的方法是在执行循环时(还有其他方法可以做到),如:

String answer;
boolean invalid = false;
do {
    if(invalid) {
        JOptionPane.showMessageDialog(null,
                "Invalid answer. Please enter A, B, C, D, or E.");
    }

    answer = JOptionPane.showInputDialog(Question);
    answer = answer.toUpperCase();
    invalid = !(answer.equals("A") || answer.equals("B") 
               || answer.equals("C") || answer.equals("D")
               || answer.equals("E"));
} while (invalid);
    return answer;

答案 2 :(得分:0)

  • 只要条件为真,While Loop就会继续。
  • “ ||” (OR logical operator仅在所有语句为假时才返回假,例如: 假||假=假

例如,在您的代码中,如果用户选择B,则第一个评估!answer.equals("A")会破坏您想要的内容,返回 true 并忽略其他语句。

更改“ while循环”以根据您的需要正确评估您的状况(不断询问直到答案与“ A”或“ B”或“ C”或“ D”或“ E”不同)。因此,请准确表达:

while ( !( answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D") || answer.equals("E") ) ){
   ...
}

请注意“!” (不是逻辑运算符),并且使用括号,这对于它的正常运行至关重要。