Java:if/else即使没有编译错误也不响应
我写了一个简单的if/else,用来打印if-else的答案。但即使输入正确,也不会响应。我看不出我错过了什么Java:if/else即使没有编译错误也不响应,java,if-statement,logic,Java,If Statement,Logic,我写了一个简单的if/else,用来打印if-else的答案。但即使输入正确,也不会响应。我看不出我错过了什么 import java.util.Scanner; public class MarriageQuiz{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String marStat; System.out.pri
import java.util.Scanner;
public class MarriageQuiz{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String marStat;
System.out.print("Please enter your Marital Status (M or S) >> ");
marStat = input.nextLine();
marStat = marStat.toUppercase();
if(marStat.equals('M')){
System.out.print("You are married");
}
else if(marStat.equals('S')){
System.out.print("You are single");
}
}
}
使用“
您的代码将一个
字符串
对象与一个字符文本进行比较,我相信JVM会将其放入一个字符
对象中。这两个对象不属于同一个类,因此“M”.equals('M')
将返回false。要解决此问题,请使用“M”.equals(“M”)
将toUppercase()
更改为toUppercase()
并将marStat.equals('M')
更改为marStat.equals('S')
也将marStat.equals('S')
更改为marStat.equals('S')
另一方面,您可以使用
字符
类型而不是“字符串”。使用字符
更准确,因为您只处理一个字符
Scanner input = new Scanner(System.in);
Character marStat;
System.out.print("Please enter your Marital Status (M or S) >> ");
marStat = input.next().charAt(0);
marStat = Character.toUpperCase(marStat);
if (marStat.equals('M')) {
System.out.println("You are married");
} else if (marStat.equals('S')) {
System.out.println("You are single");
}
如上面的注释所述,您正在将字符串对象与自动装箱字符对象进行比较。一种修复方法显然是使用双引号,Java将自动装箱到您的代码将工作的字符串对象 保存几行代码的一些技巧:使用String.equalsIgnoreCase()保存一行,将传入字符串转换为大写
接下来,考虑使用常数作为婚姻状况:
public class MarriageQuiz{
private static final String STATUS_MARRIED = "M";
...
if (marStat.equalsIgnoreCase(STATUS_MARRIED)) {
...
通过这种方式,你可以在你的代码中使用STATUS\u marred,但是可以很容易地将它从,比如说,“M”改为“marred”。你需要将一个字符串与另一个字符串进行比较,即使用
if(marStat.equals(“M”){…}
,所以我需要建立第二个字符串,然后比较它?我不确定我是否理解。在Java中,单引号是char
,双引号是String
。您正在将字符串
与字符
进行比较,该字符总是false
。感谢您告诉我原因。它实际上解释了很多,因为我开始在代码中使用char,但发现我不需要它。我忘了调整引号了,上面的说法是正确的,但要补充一点细节:在Java中,字符(用单引号括起来的单字符)存储为原语。字符串是对象。当调用marStat.equals('S')时,您试图将字符串对象与char原语进行比较。在后台,Java将把char原语自动装箱到Character对象,这将无法与字符串进行比较。我将在下面的答案中添加一些提示。这解决了一个我还不知道的问题,谢谢。请注意,虽然这与此特定案例并不相关,但Character.toUpperCase通常不是一个好主意。请参阅规范:“一般来说,String.toUpperCase()应用于将字符映射为大写。字符串大小写映射方法比字符大小写映射方法有几个优点。字符串大小写映射方法可以执行区域设置敏感映射、上下文敏感映射和1:M字符映射,而字符大小写映射方法则不能。”
Scanner input = new Scanner(System.in);
Character marStat;
System.out.print("Please enter your Marital Status (M or S) >> ");
marStat = input.next().charAt(0);
marStat = Character.toUpperCase(marStat);
if (marStat.equals('M')) {
System.out.println("You are married");
} else if (marStat.equals('S')) {
System.out.println("You are single");
}
public class MarriageQuiz{
private static final String STATUS_MARRIED = "M";
...
if (marStat.equalsIgnoreCase(STATUS_MARRIED)) {
...