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

axkjgtzd  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(477)

我想创建一个测试,如果用户输入(答案变量)不等于“a”、“b”、“c”、“d”或“e”,则会给出一个错误消息,说明答案无效,然后再次询问问题以获得新的输入。即使答案等于“a”、“b”、“c”、“d”或“e”,while循环仍然在运行,我很难找出原因。任何帮助都将不胜感激。非常感谢你。

import javax.swing.JOptionPane;
public class Quiz {
    static String ask(String Question) {
        String answer = JOptionPane.showInputDialog(Question);
        answer = answer.toUpperCase();
        while (!answer.equals("A") || !answer.equals("B") || !answer.equals("C") || 
!answer.equals("D") || !answer.equals("E")) {
            JOptionPane.showMessageDialog(null,"Invalid answer. Please enter A, B, C, D, or E.");
            Quiz.ask(Question);
        }
    return answer;
}

public static void main(String[] args) {
    String question = "What is a user defined blueprint from which objects are created in Java?\n";
    question += "A. Method\n";
    question += "B. Variable\n";
    question += "C. Class\n";
    question += "D. Loop\n";
    question += "E. Array";
    Quiz.ask(question);
    }
}
t98cgbkg

t98cgbkg1#

非a、非b、非c、非d、非e在逻辑上等价于a、b、c、d、e(德摩根斯定律)你不要a,不要b,不要c,不要d,不要c

y1aodyip

y1aodyip2#

你有两个问题。
首先,你的情况不正确。如果要检查答案是否为任何允许值,则条件应为:

!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"))

请参阅马修的答案以获得解释。
第二,你在打电话 Quiz.ask(Question) 递归地,这使得循环继续在无效的答案上运行,即使用户在随后的调用中提供了正确的答案(请继续阅读并理解递归调用是如何工作的-尤其是如何管理局部变量)。解决这个问题的方法是do while循环(还有其他方法),如下所示:

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;
ubby3x7f

ubby3x7f3#

只要条件被评估为true,“while循环”就会继续。
“| |”(或逻辑运算符)仅在所有语句都为false时返回false,例如:false | | false=false
在您的代码中,如果用户选择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") ) ){
   ...
}

注意“!”(不是逻辑运算符)和括号的使用,这对它的工作至关重要。

相关问题