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
。您将String
与char
进行比较,后者始终为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功能重复,如何优化,三目我试过编译错误