两个看似相等的字符串不相等

时间:2012-11-19 12:04:22

标签: java android string if-statement equals

我有一段代码可以根据所选的输入和输出更改参数的值。因此,在下面的示例中,我计算球体的体积,然后根据用户用于输入的单位和用户为输出选择的单位,相应地操纵数字。

我的问题是我的所有if语句都返回false,而且无论选择什么,数字10(来自else)都会出现。我打印出了inputPref和outputPref的值,它们看起来完全等于“mm”和“cubic cm”(例如),但仍然不会被if语句捕获。

有任何明显错误吗?如果有帮助,则从共享首选项加载两个变量“inputPref”和“outputPref”!

double volumeBase = 4 * piDouble * radius * radius * radius / 3;

                double volume;
                if(inputPref.equals("mm") || outputPref.equals("cubic cm"))
                {
                    volume = volumeBase / 1000;
                }
                if(inputPref.equals("mm") || outputPref.equals("cubic metres"))
                {
                    volume = volumeBase / 1000000000;
                }
                if(inputPref.equals("cm") || outputPref.equals("cubic mm"))
                {
                    volume = volumeBase * 1000;
                }
                if(inputPref.equals("cm") || outputPref.equals("cubic metres"))
                {
                    volume = volumeBase / 1000000;
                }
                if(inputPref.equals("metres") || outputPref.equals("cubic mm"))
                {
                    volume = volumeBase * 1000000000;
                }
                if(inputPref.equals("metres") || outputPref.equals("cubic cm"))
                {
                    volume = volumeBase * 1000000;
                }
                else
                {
                    volume = 10;
                }

5 个答案:

答案 0 :(得分:6)

您的所有if语句(第一个除外)都应为else if语句,因此它只会从您的所有选项中选择1个。

按照目前的情况,你的代码可能在早期评估if语句,但它会被最后的if-else覆盖,这几乎总是会返回{{1} }}

正如评论中所指出的那样,您可能也意味着使用10而不是&&,以便在两个条件匹配时运行代码每个||if声明。您也可以考虑使用else if而不是equalsIgnoreCase(),以便用户输入的情况无关紧要。

应该是......

equals()

如果它仍然无效,那么您正在阅读用户输入的代码可能存在问题。

答案 1 :(得分:6)

如果else不是10inputPref,那么最后metres会将音量设置为cubic cm,因为只有最后 ifelse有关。如果您将else放在之前if的每个之前,它可能会比您预期的更多。您还有一些重复项(您不止一次检查mm)。

E.g。 (但也见下文):

double volume;
if(inputPref.equals("mm") || outputPref.equals("cubic cm"))
{
    volume = volumeBase / 1000;
}
// v--- Note the `else`
else if(inputPref.equals("mm") || outputPref.equals("cubic metres"))
{
    volume = volumeBase / 1000000000;
}
// ...

另外,作为noted by Lews Therin,我怀疑你想要每对&&,例如:

// here -------------------vv
if (inputPref.equals("mm") && outputPref.equals("cubic cm"))

if (inputPref.equals("mm") || outputPref.equals("cubic cm"))

答案 2 :(得分:5)

我认为你想使用else if并在你的条件下使用&&不是||

答案 3 :(得分:1)

可能是您的上一次 / strong>,注意:其他只适用于最后一个if。 使用else-if代替所有if的

if(cond){

}
else if(cond){

}
else{

}

答案 4 :(得分:1)

我会扔掉字符串,并使用枚举代替这种代码......

public enum LengthUnit {
  M,
  CM,
  MM
}

public enum VolumeUnit {
  M3,
  CM3,
  MM3
}

您甚至可以将转换率放在类似单位中,例如TimeUnit

优点:

  • 没有错误,没有神秘感
  • 更快

缺点:

    如果需要扩展,
  • 需要做一些努力来维护。