0

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

我的问题是,我所有的 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;
                }
4

5 回答 5

6

您的所有if陈述(第一个除外)都应该是else if陈述,因此它只从您的所有选项中选择 1 个。

就目前而言,您的代码可能会在if早期评估一个语句,但它会在最后被最后一个覆盖if-else,这几乎总是会返回10

正如评论中所指出的,您可能还打算使用&&而不是,||以便在每个or语句中的两个条件都匹配时运行代码。您也可以考虑使用而不是,以便用户输入的大小写无关紧要。ifelse ifequalsIgnoreCase()equals()

它应该是...

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

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

如果仍然无法正常工作,则可能是您正在读取用户输入的代码存在问题。

于 2012-11-19T12:06:08.230 回答
6

else最后会将音量设置为10如果inputPref不是metres,或者cubic cm因为只有你的最后一个 if与那个有关else。如果你把else前面的每一个都放在前面if,它可能会像你期望的那样工作得更多。您还有一些重复项(您要检查mm不止一次)。

例如(但另见下文):

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;
}
// ...

此外,正如Lews Therin所指出的,我怀疑你想要&&每一对,例如:

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

不是

if (inputPref.equals("mm") || outputPref.equals("cubic cm"))
于 2012-11-19T12:06:11.500 回答
5

我认为您想使用else if's 并在您的条件下使用 && 而不是 ||

于 2012-11-19T12:06:27.893 回答
1

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

public enum LengthUnit {
  M,
  CM,
  MM
}

public enum VolumeUnit {
  M3,
  CM3,
  MM3
}

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

优点:

  • 没有错字,没有谜团
  • 更快

缺点:

  • 如果需要扩展,需要一些努力来维护。
于 2012-11-19T12:09:40.773 回答
1

可能您的最后一个if失败,因此在else中将分配为10 注意 else 仅适用于最后一个 if。使用 else-if 代替所有的 if

if(cond){

}
else if(cond){

}
else{

}
于 2012-11-19T12:06:34.497 回答