Java 而循环就是不工作

Java 而循环就是不工作,java,Java,我只是想解释一下为什么下面的代码不起作用,以及如何运行代码的解决方案 该程序的目标是获得一张扑克牌的用户输入,J、Q、K、a、小写或大写。程序必须只接受这些值中的一个,因此需要验证用户输入,显示错误并提示,直到输入接受的值。然后,程序必须接受用户输入的值,并将扑克牌的名称打印到控制台上,即Jack、Queen、King、Ace package practical_1; import static java.lang.System.out; import java.util.Scanner;

我只是想解释一下为什么下面的代码不起作用,以及如何运行代码的解决方案

该程序的目标是获得一张扑克牌的用户输入,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;
                }

    }

}
这句话,

(Usr|U卡!=“K”| Usr|U卡!=“Q”| Usr|U卡!=“J”| Usr|U卡!=“A”)

始终求值为true,因此循环将永不退出

在这里你需要的是逻辑,比如:

(Usr\U卡!=“K”&Usr\U卡!=“Q”&Usr\U卡!=“J”&Usr\U卡!=“A”)

这句话,

(Usr|U卡!=“K”| Usr|U卡!=“Q”| Usr|U卡!=“J”| Usr|U卡!=“A”)

始终求值为true,因此循环将永不退出

在这里你需要的是逻辑,比如:

(Usr\U卡!=“K”&Usr\U卡!=“Q”&Usr\U卡!=“J”&Usr\U卡!=“A”)


while
循环中的条件更改为:

while (Usr_Card.equals("K") && Usr_Card.equals("Q") && Usr_Card.equal("J") && Usr_Card.equals("A"))    

编辑:正如@ScaryWombat在评论中指出的,字符串比较的方法从“!=”改为“!”到
equals()

循环时将
中的条件更改为:

while (Usr_Card.equals("K") && Usr_Card.equals("Q") && Usr_Card.equal("J") && Usr_Card.equals("A"))    

编辑:正如@ScaryWombat在评论中指出的,字符串比较的方法从“!=”改为“!”到
equals()

如果任何部分为真,则OR运算符| |返回真。在您的示例中,如果卡不是K或不是Q或不是J或不是A,则继续循环

让我们把它分解一下。用户输入“K”

我们真正想检查的是输入是否无效。当输入与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”

因此,正如您所看到的,由于AND&&操作,我们只有在不匹配任何有效字符时才继续循环

正如可怕的袋熊所指出的,你不应该使用
==
=带有字符串。您应该使用
.equals

while( !Usr_Card.equals("K") && !Usr_Card.equals("Q") && !Usr_Card.equals("J") && !Usr_Card.equals("A") )

如果任何部分为真,OR运算符| |返回真。在您的示例中,如果卡不是K或不是Q或不是J或不是A,则继续循环

让我们把它分解一下。用户输入“K”

我们真正想检查的是输入是否无效。当输入与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”

因此,正如您所看到的,由于AND&&操作,我们只有在不匹配任何有效字符时才继续循环

正如可怕的袋熊所指出的,你不应该使用
==
=带有字符串。您应该使用
.equals

while( !Usr_Card.equals("K") && !Usr_Card.equals("Q") && !Usr_Card.equals("J") && !Usr_Card.equals("A") )

那里有一个漂亮的无限循环。您有一个逻辑问题,并且您正在错误地比较
字符串
实例。当
Usr\u卡
K
时,表示它不是
Q
a
等。。。因此,它从不退出
while
循环。相反,您需要
&
(不是或)-在比较stringsTry
时,最好使用
.equals(…)
,而(!Usr_Card.matches(“[KQJA]”)则使用
。谢谢@shmosel。按需要工作!为什么不在
while
循环中使用
开关
,并继续使用
默认值
呢?这里有一个很好的无限循环。您有一个逻辑问题,并且您正在错误地比较
字符串
实例。当
Usr\u卡
K
时,表示它不是
Q
a
等。。。因此,它从不退出
while
循环。相反,您需要
&
(不是或)-在比较stringsTry
时,最好使用
.equals(…)
,而(!Usr_Card.matches(“[KQJA]”)则使用
。谢谢@shmosel。按需要工作!为什么不在
循环中使用
开关
,并继续使用
默认值