我只是想解释(为什么)以下代码无效的原因以及使代码运行的解决方案(如何)。
该计划的目标是获得用户输入的扑克牌,J,Q,K,A,小写或大写。程序必须只接受其中一个值,因此需要验证用户输入,显示错误并提示输入接受值。然后程序必须取用户输入的值,并将扑克牌的名称打印到控制台上,Jack,Queen,King,Ace。
package practical_1;
import static java.lang.System.out;
import java.util.Scanner;
public class Question_4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String Usr_Card;
out.print("Enter Card Letter Here.... ");
Usr_Card = input.next();
Usr_Card = Usr_Card.toUpperCase();
while (Usr_Card != "K" || Usr_Card != "Q" || Usr_Card != "J" || Usr_Card != "A"){
out.print("Invalid Input\nEnter Valid Card Letter Here: ");
Usr_Card = input.next();
Usr_Card = Usr_Card.toUpperCase();
}
switch (Usr_Card) {
case ("J"):
out.print("Jack");
break;
case ("Q"):
out.print("Queen");
break;
case ("K"):
out.print("King");
break;
case ("A"):
out.print("Ace");
break;
}
}
}
答案 0 :(得分:3)
OR运算符||如果任何section为true,则返回true。在您的示例中,如果卡不是K或不是Q或不是J或不是A,请继续循环。
让我们打破它。用户输入“K”
Usr_Card != "K" // false
Usr_Card != "Q" // true
Usr_Card != "J" // true
Usr_Card != "A" // true
false || true || true || true === true // continue the loop
我们真正想要检查的是输入是否无效。当它与K,Q,J或A中的至少一个不匹配时,输入无效。或者更好地说,当不是K而不是Q而不是J而不是A时。
我们只是从||改变我们的条件到&&同样的例子
Usr_Card != "K" // false
Usr_Card != "Q" // true
Usr_Card != "J" // true
Usr_Card != "A" // true
false && true && true && true === false // do not continue the loop
while (Usr_Card != "K" && Usr_Card != "Q" && Usr_Card != "J" && Usr_Card != "A")
让我们尝试一个无效的例子。使用输入“A”
Usr_Card != "K" // true
Usr_Card != "Q" // true
Usr_Card != "J" // true
Usr_Card != "A" // true
true && true && true && true === true // continue the loop
正如您所看到的,由于我们的AND&& amp;& amp;&操作
正如Scary Wombat指出的那样,你不应该在字符串中使用==
或!=
。您应该使用.equals
while( !Usr_Card.equals("K") && !Usr_Card.equals("Q") && !Usr_Card.equals("J") && !Usr_Card.equals("A") )
答案 1 :(得分:0)
这个表达式,
(Usr_Card!=“K”|| Usr_Card!=“Q”|| Usr_Card!=“J”|| Usr_Card!=“A”)
始终求值为true,因此循环永不退出。
这里需要AND逻辑,例如:
(Usr_Card!=“K”&& Usr_Card!=“Q”&& Usr_Card!=“J”&& Usr_Card!=“A”)
答案 2 :(得分:0)
将while
循环中的条件更改为:
while (Usr_Card.equals("K") && Usr_Card.equals("Q") && Usr_Card.equal("J") && Usr_Card.equals("A"))
编辑:正如@ScaryWombat在评论中所指出的,字符串比较方法已从'!='更改为equals()
。