Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么即使条件为false,while循环仍在运行?_Java_While Loop_Infinite Loop - Fatal编程技术网

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

Java 为什么即使条件为false,while循环仍在运行?,java,while-loop,infinite-loop,Java,While Loop,Infinite Loop,我想创建一个测验,如果用户输入的答案变量不等于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

我想创建一个测验,如果用户输入的答案变量不等于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);
    }
}

不是A或不是B或不是C或不是D或不是E在逻辑上等同于A和B,C和D和E。德摩根斯定律你不想要A和B,也不想要C,也不想要D,也不想要C。不是A或B,也不想要C,也不想要D,也不想要D你有两个问题

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

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

请参阅以获取解释

其次,您递归调用quick.askQuestion,这会使您的循环继续在无效答案上运行,即使用户在后续调用中提供了正确的答案。请继续阅读并理解递归调用的工作原理,特别是如何管理局部变量。 解决此问题的方法是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;
你有两个问题

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

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

请参阅以获取解释

其次,您递归调用quick.askQuestion,这会使您的循环继续在无效答案上运行,即使用户在后续调用中提供了正确的答案。请继续阅读并理解递归调用的工作原理,特别是如何管理局部变量。 解决此问题的方法是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;
只要条件的计算结果为真,该过程就会继续。 ||仅当所有语句都为false时返回false,例如: 假| |假=假 在您的代码中,如果用户选择B,例如,第一次求值!answer.equals中断所需内容,返回true并忽略其他语句

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

while ( !( answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D") || answer.equals("E") ) ){
   ...
}
注意!不是逻辑运算符和括号的使用,这对它的工作至关重要

只要条件的计算结果为真,该过程就会继续。 ||仅当所有语句都为false时返回false,例如: 假| |假=假 在您的代码中,如果用户选择B,例如,第一次求值!answer.equals中断所需内容,返回true并忽略其他语句

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

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

注意!不是逻辑运算符和括号的使用,这是它工作的关键。

答案不能同时是A、B、C、D和E。组合OR和逻辑否定时要小心。旁注:您的ask执行不必要地堆积起来,而是使用do while循环,并在循环中使用JOptionPane.showInputDialogQuestion,而不是递归调用quick.askQuestion。您可能希望您的条件是while!回答:equalsA&!answer.equalsB&!answer.equalsC&!答案:equalsD&!回答,等一会儿!我感谢你的答复。不过,我不希望答案同时是所有这些问题。我想这样做,如果它不是5个有效答案A、B、C、D或E中的任何一个,我会得到一个无效错误。第一个建议在我第一次给出有效答案时有效,但如果我第一次输入无效答案,我希望循环在我输入有效答案时停止,但在这种情况下,它仍然会反复给出无效错误。此外,如果有机会我澄清了我在寻找什么,我不希望答案是全部5个,而只是其中一个,你还有其他建议吗?再次感谢。不要反复地打电话问问题。当答案不能同时是a、B、C、D和E时,使用do循环。在组合OR和逻辑否定时要小心。旁注:您的ask执行不必要地堆积起来,而是使用do while循环,并在循环中使用JOptionPane.showInputDialogQuestion,而不是递归调用quick.askQuestion。您可能希望您的条件是while!回答:equalsA&!answer.equalsB&!answer.equalsC&!答案:equalsD&!回答,等一会儿!我感谢你的答复。不过,我不希望答案同时是所有这些问题。我想让它变得如此完美
如果它不是5个有效答案A、B、C、D或E中的任何一个,我将得到一个无效错误。第一个建议在我第一次给出有效答案时有效,但如果我第一次输入无效答案,我希望循环在我输入有效答案时停止,但在这种情况下,它仍然会反复给出无效错误。此外,如果有机会我澄清了我在寻找什么,我不希望答案是全部5个,而只是其中一个,你还有其他建议吗?再次感谢。不要反复地打电话问问题。趁我还没弄到的时候用do。。但是是的,这就是我想要的。当循环运行时,我不希望答案等于这些答案中的任何一个。但当答案等于5中的一个时,在这种情况下循环应该为false,但它仍然运行。非常感谢。在另一篇评论中,我看到您说,如果初始条目正确,则该条件现在有效,但初始无效不会中断。你在用小写字母测试吗?我看到您在循环中使用.toUpperCase和计算大写字母。尝试使用.equalsIgnoreCase而不是.toUpperCase和evaluating case。您好,Matthew。谢谢你的建议,但这实际上是一项作业,我必须根据大写字母进行评估,所以我必须使用该方法,因此即使我输入小写字母,它也会以这种方式进行评估。明白了。。但是是的,这就是我想要的。当循环运行时,我不希望答案等于这些答案中的任何一个。但当答案等于5中的一个时,在这种情况下循环应该为false,但它仍然运行。非常感谢。在另一篇评论中,我看到您说,如果初始条目正确,则该条件现在有效,但初始无效不会中断。你在用小写字母测试吗?我看到您在循环中使用.toUpperCase和计算大写字母。尝试使用.equalsIgnoreCase而不是.toUpperCase和evaluating case。您好,Matthew。谢谢你的建议,但这实际上是一项作业,我必须根据大写字母进行评估,因此我必须使用该方法,因此即使我输入小写字母,它也会以这种方式进行评估。谢谢!那么,我将把无效语句放在哪里呢?我不希望在用户输入任何有效的东西之前输出它。非常感谢你。谢谢你的帮助,谢谢!那么,我将把无效语句放在哪里呢?我不希望在用户输入任何有效的东西之前输出它。非常感谢你。我感谢你的帮助。