Java: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

我写了一个简单的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.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)) {
    ...