Java 当我输入A、B、C或D时,它仍然表示这不是一个有效的答案。为什么?

Java 当我输入A、B、C或D时,它仍然表示这不是一个有效的答案。为什么?,java,string,Java,String,这是我在学校的项目。我们被要求做一个小测验,我想确保当用户输入选项之外的内容时,他们会收到一条错误消息,说这不是一个有效的答案,但无论我输入什么,它仍然说这是无效的。为什么? import java.util.Scanner; class Main { public static void main(String[] args) { String answer; int score = 0; Scanner input = new Scanner(System.in); Sy

这是我在学校的项目。我们被要求做一个小测验,我想确保当用户输入选项之外的内容时,他们会收到一条错误消息,说这不是一个有效的答案,但无论我输入什么,它仍然说这是无效的。为什么?

import java.util.Scanner;
class Main {
  public static void main(String[] args) {
  String answer;
  int score = 0;
  Scanner input = new Scanner(System.in);
  System.out.println("ALL SUBJECT QUIZ Starting now, please enter the correct option (Letters or T or F) for the next 10 questions");
      System.out.println("Question 1 (Maths): What is the vertex of the equation y=2(x-2)^2+5");
      System.out.println("A. (-2,5)" + "\n" + "B. (2, 5)" + "\n" + "C. (-2,-5)" + "\n" + "D. (2, -5)");
      answer = input.nextLine();
      answer = answer.toUpperCase();
      
      while (!answer.equals("A") || !answer.equals("B") || !answer.equals("C") || !answer.equals("D")) {
        System.out.println("That is not a valid response");
        answer = input.nextLine();
        answer = answer.toUpperCase();
      }
        if (answer.equals("A")) {
          System.out.println("Incorrect, the answer is B");
        } else if (answer.equals("B")){
          System.out.println("Correct");
          score += 1;
        } else if (answer.equals("C")){
          System.out.println("Incorrect, the answer is B");
        } else if (answer.equals("D")){
          System.out.println("Incorrect, the answer is B");
        }

  }
}

任何帮助都将不胜感激

如果查看while循环条件,您会注意到它将始终计算为
true
,因为用户输入不能同时等于
A
B
C
D

因此,这里的解决方案是将条件中的or(
|
)更改为and(
&&
),因为您希望用户输入仅为以下内容之一:
A
B
C
,或
D

while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D")) {
    System.out.println("That is not a valid response");
    answer = input.nextLine();
    answer = answer.toUpperCase();
}

如果查看while循环条件,您会注意到它的计算结果总是
true
,因为用户输入不能同时等于
A
B
C
D

因此,这里的解决方案是将条件中的or(
|
)更改为and(
&&
),因为您希望用户输入仅为以下内容之一:
A
B
C
,或
D

while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D")) {
    System.out.println("That is not a valid response");
    answer = input.nextLine();
    answer = answer.toUpperCase();
}

让我们评估一下您的以下情况:

!answer.equals("A") || !answer.equals("B") || !answer.equals("C") || !answer.equals("D")
假设,answer=E

现在,您的情况将被评估为

true | |!回答:等于(B)| |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

请注意,当多个条件与
|
合并时,只要找到
true
条件,计算就会停止

假设,answer=B

现在,您的情况将被评估为

true | |!回答:等于(B)| |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

假设,answer=A

现在,您的情况将被评估为

false | | true | |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

因此,您可以看到,无论答案如何,条件的计算结果总是
true

解决方案: 换成

while (!(answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D")))
while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D"))
这意味着答案不是(
A
,或
B
,或
C
,或
D

或者,您可以将其更改为

while (!(answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D")))
while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D"))
这意味着答案不是
A
,答案不是
B
,答案不是
C
,答案不是
D

while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D")) {
    System.out.println("That is not a valid response");
    answer = input.nextLine();
    answer = answer.toUpperCase();
}

然而,为了简单起见,我的口味是第一位的。

让我们评估一下您的以下情况:

!answer.equals("A") || !answer.equals("B") || !answer.equals("C") || !answer.equals("D")
假设,answer=E

现在,您的情况将被评估为

true | |!回答:等于(B)| |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

请注意,当多个条件与
|
合并时,只要找到
true
条件,计算就会停止

假设,answer=B

现在,您的情况将被评估为

true | |!回答:等于(B)| |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

假设,answer=A

现在,您的情况将被评估为

false | | true | |!回答:等于(“C”)| |!回答。等于(“D”)
=>
true

因此,您可以看到,无论答案如何,条件的计算结果总是
true

解决方案: 换成

while (!(answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D")))
while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D"))
这意味着答案不是(
A
,或
B
,或
C
,或
D

或者,您可以将其更改为

while (!(answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D")))
while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D"))
这意味着答案不是
A
,答案不是
B
,答案不是
C
,答案不是
D

while (!answer.equals("A") && !answer.equals("B") && !answer.equals("C") && !answer.equals("D")) {
    System.out.println("That is not a valid response");
    answer = input.nextLine();
    answer = answer.toUpperCase();
}

然而,为了简单起见,我的品味是第一位的。

虽然(!answer.equals(“A”)| |!answer.equals(“B”)|!answer.equals(“C”)| |!answer.equals(“D”)
-糟糕的逻辑,它总是不等于这4个选项中的至少3个(因此总是正确的)。将这些
|
中的每一个更改为
&
,而(!answer.equals(“A”)|!answer.equals(“B”)|!answer.equals(“C”)|!answer.equals(“D”)
-糟糕的逻辑,它总是不等于这4个选项中的至少3个(因此总是正确的)。将这些
|
中的每一个更改为