У вас две проблемы.
Во-первых, ваше состояние неверно. Если вы хотите проверить, что ответом является любое из допустимых значений, то ваше условие должно быть одним из:
!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)
рекурсивно, что заставляет ваш l oop продолжать работать с неверными ответами, даже если пользователь вводит правильный ответ при последующем вызове (пожалуйста, прочитайте и понять, как работают рекурсивные вызовы - особенно, как управляются локальные переменные). Исправление для этого было бы делать пока l oop (есть другие способы сделать это), как в:
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;