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