【问题标题】:Why is my while loop still running even when the condition is false?为什么即使条件为假,我的 while 循环仍在运行?
【发布时间】:2020-02-14 01:18:35
【问题描述】:

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

【问题讨论】:

  • answer 不能同时是 A、B、C、D 和 E。将OR 和逻辑否定结合使用时要小心。旁注:您的 ask 执行不必要地叠加(而是使用 do-while 循环并在循环中使用 JOptionPane.showInputDialog(Question) 而不是递归调用 Quiz.ask(Question)。
  • 您可能希望您的条件为while(!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D") && !answer.equals("E")) 或while(!(answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D") || answer.equals("E")))
  • 您好,感谢您的回复。不过,我不希望答案同时出现。我想这样做,如果它不是 5 个有效答案(“A”、“B”、“C”、“D”或“E”)中的任何一个,我会收到一个无效错误。如果我第一次给出有效答案,第一个建议有效,但如果我第一次输入无效答案,我希望循环在我输入有效答案时停止,但在这种情况下,它仍然反复给我一个无效错误。
  • 另外,如果我有任何机会澄清了我正在寻找的内容,即我不想回答全部 5 个并且只是其中一个,您还有其他建议吗?再次感谢您。
  • 不要递归调用Quiz.ask(Question)。使用 do-while 循环

标签: java while-loop infinite-loop


【解决方案1】:

Not A or Not B or Not C or Not D or Not E 在逻辑上等价于 A and B and C and D and E. (DeMorgans Law) 你想要 Not A and Not B and Not C and Not D and Not C

【讨论】:

  • 知道了。但是,是的,这就是我想要的。我不希望答案等于循环运行时的任何一个。但是当 answer 等于 5 之一时,在这种情况下循环应该是错误的,但它仍然运行。谢谢!
  • 在另一条评论中,我看到您说如果初始输入正确,此条件现在有效,但初始无效不会中断。您是否使用小写字母进行测试?我看到您使用 .toUpperCase() 并在循环中评估大写。尝试使用 .equalsIgnoreCase() 而不是 .toUpperCase() 并评估大小写。
  • 嗨,马修。谢谢你的建议,但这实际上是一个作业,我必须根据大写来评估,所以我不得不使用那个方法,所以即使我输入一个小写字母,它也会这样评估。
【解决方案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),这会使您的循环继续在无效答案上运行,即使用户在后续调用中提供了正确答案(请继续阅读并了解递归调用的工作原理 - 特别是本地变量被管理)。 解决此问题的方法是使用 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;

【讨论】:

  • 谢谢!那么我应该把无效的声明放在哪里呢?
  • 我不希望它在用户输入任何内容之前输出
  • 好的,成功了。非常感谢你。感谢您的帮助。
【解决方案3】:
  • 只要条件被评估为真,"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") ) ){
   ...
}

注意“!” (非逻辑运算符)和括号的使用,这是它工作的必要条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2021-02-07
    • 2014-03-30
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多