Java:即使没有编译错误,if / else 也没有响应

Posted

技术标签:

【中文标题】Java:即使没有编译错误,if / else 也没有响应【英文标题】:Java: if / else not responding even with no compile errors 【发布时间】:2016-12-27 08:54:03 【问题描述】:

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

【问题讨论】:

您需要将一个字符串marStat 与另一个字符串进行比较,即使用if (marStat.equals("M")) ... 所以我需要建立第二个字符串然后比较它?我不确定我是否理解。 在Java中,单引号是char,双引号是String。您将Stringchar 进行比较,后者始终为false 感谢您告诉我原因。当我开始在代码中使用 char 但发现我不需要它时,它实际上解释了很多。我忘了调整引号。 以上是正确的,但要补充一点细节:在Java中,字符(单引号中的单个字符)存储为原语。字符串是对象。当您调用 marStat.equals('S') 时,您正在尝试将 String 对象与 char 原语进行比较。在底层,Java 会将 char 原语自动装箱为 Character 对象,这将无法与 String 进行比较。我将在下面的答案中添加一些提示。 【参考方案1】:

您的代码正在将 String 对象与字符文字进行比较,我相信 JVM 会将其装入 Character 对象中。好吧,这两个对象不属于同一个类,所以"M".equals('M') 将返回false。要解决此问题,请使用"M".equals("M")

toUppercase() 更改为toUpperCase()marStat.equals('M') 更改为marStat.equals("M") 也将marStat.equals('S') 更改为marStat.equals("S")

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");
        
    

【讨论】:

这解决了一个我还不知道的问题,谢谢。【参考方案2】:

另一方面,您可以使用Character 类型而不是“字符串”。使用Character 会更准确,因为您只处理一个字符。

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");

【讨论】:

请注意,尽管这与这个特殊情况并不真正相关,但 Character.toUpperCase 通常不是一个好主意。参见规范:“一般来说,String.toUpperCase() 应该用于将字符映射为大写。字符串大小写映射方法比字符大小写映射方法有几个好处。字符串大小写映射方法可以执行区域敏感映射、上下文敏感映射, 和 1:M 字符映射,而字符大小写映射方法不能。”【参考方案3】:

使用""

if(marStat.equals("M"))
        System.out.print("You are married");
    
    else if(marStat.equals("S"))
        System.out.print("You are single");
    

【讨论】:

【参考方案4】:

正如上面评论中提到的,您将 String 对象与自动装箱的 Character 对象进行比较。一种解决方法显然是使用双引号,Java 将自动装箱到您的代码可以工作的 String 对象。

保存几行代码的一些技巧:使用String.equalsIgnoreCase() 保存将传入字符串转换为大写的行。

接下来,考虑使用一个常数来表示婚姻状况:

public class MarriageQuiz
    private static final String STATUS_MARRIED = "M";
    ...
    if (marStat.equalsIgnoreCase(STATUS_MARRIED)) 
    ...

这样,您可以在整个代码中使用 STATUS_MARRIED,但可以轻松地将其从“M”更改为“Married”。

【讨论】:

以上是关于Java:即使没有编译错误,if / else 也没有响应的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:即使 `if` 语句为真,`else` 语句也会被执行

java代码求助,感觉两个if功能重复,如何优化,三目我试过编译错误

if 和 else 没有大括号

编写 if-else 编译器时会抱怨,但简而言之却没有,为啥? [复制]

Shell if else语句(详解版)

为啥我的代码在 else 语句后出现编译错误?