如何修复'variable is always true'或"...假'?



我正在创建一个程序,在高速公路的某个路段收费。在某些时候,通行费有不同的费率。我开始了这段代码,但在使用 Intellij IDEA 时说我的变量(小时和分钟)总是正确的。在第一个"else if"语句之后,其余的"else if"语句说整个条件总是假的。我猜我可能已经建立了一个无限循环?我很困,需要一点推动才能前进。(回报只是给出特定时间的价格。

/**
* The method takes hour, minute, and "am", "pm" components of the time stamp of the moment when car crosses the bridge and calculates the toll rate.
* If any of the time stamp components are invalid, -1 is being returned as an error code.
* @param hour hour component of the time stamp
* @param min minute component of the time stamp
* @param amPm either string "am" or "pm", component of the time stamp
* @return the toll rate
*/
public static double toll520Bridge(int hour, int min, String amPm) {
if ((hour < 0 || hour > 12) || (min < 0 || min > 59) || (!"am".equals(amPm) && !"pm".equals(amPm))) return -1;
else if ((hour <= 12 && hour >= 4) && (min <= 59) && ("am".equals(amPm))) return 1.25;
else if ((hour <= 7 && hour >= 5) && (min <= 59) && ("am".equals(amPm))) return 1.4;
else if ((hour <= 10 && hour >= 8) && (min <= 59) && ("am".equals(amPm))) return 2.05;
}

为了清楚起见,让我们重新格式化您的代码:

if ((hour < 0 || hour > 12) || (min < 0 || min > 59) || (!"am".equals(amPm) && !"pm".equals(amPm))) {
return -1;
}
else if ((hour <= 12 && hour >= 4) && (min <= 59) && ("am".equals(amPm)))  {
return 1.25;
}
else if ((hour <= 7 && hour >= 5) && (min <= 59) && ("am".equals(amPm))) {
return 1.4;
}
else if ((hour <= 10 && hour >= 8) && (min <= 59) && ("am".equals(amPm))) {
return 2.05;
}

第一个if语句检查无效的输入参数。您可以将其重构为返回 true 或 false 的单独方法,以使内容更易于阅读:

private boolean parametersAreInvalid(int hour, int min, String amPm) {
return (hour < 0 || hour > 12 || min < 0 || min > 59 || (!"am".equals(amPm) && !"pm".equals(amPm)));
}

此外,如果您的if块以返回结束,则无需使用else

if (parametersAreInvalid(hour, min, amPm)) {
return -1;
}
if ((hour <= 12 && hour >= 4) && (min <= 59) && "am".equals(amPm))  {
return 1.25;
}
if ((hour <= 7 && hour >= 5) && (min <= 59) && "am".equals(amPm)) {
return 1.4;
}
if ((hour <= 10 && hour >= 8) && (min <= 59) && "am".equals(amPm)) {
return 2.05;
}

现在我们知道min变量必须是有效的,所以我们不需要继续检查它是否为 <= 59,同样,hour变量也必须是 <= 12:

if (parametersAreInvalid(hour, min, amPm)) {
return -1;
}
if (hour >= 4 && "am".equals(amPm))  {
return 1.25;
}
if ((hour <= 7 && hour >= 5) && "am".equals(amPm)) {
return 1.4;
}
if ((hour <= 10 && hour >= 8) && "am".equals(amPm)) {
return 2.05;
}

现在真正的问题 - 您的第二个if语句涵盖了一个小时范围,其中包括第三个和第四个if语句的范围。它们需要重新排序。定价也有一个线索 - 您可能希望收取适用的最高通行费。

if (parametersAreInvalid(hour, min, amPm)) {
return -1;
}
if ((hour <= 10 && hour >= 8) && "am".equals(amPm)) {
return 2.05;
}
if ((hour <= 7 && hour >= 5) && "am".equals(amPm)) {
return 1.4;
}
if (hour >= 4 && "am".equals(amPm))  {
return 1.25;
}

您可以嵌套if语句以涵盖常见测试:

if (parametersAreInvalid(hour, min, amPm)) {
return -1;
}
if ("am".equals(amPm)) {
if (hour <= 10 && hour >= 8) {
return 2.05;
}
if (hour <= 7 && hour >= 5) {
return 1.4;
}
if (hour >= 4)  {
return 1.25;
}
}

最后,如果if语句都不匹配,您的方法仍然需要返回一个值 - 该值应该是多少?上述时间以外是否免费?如果是这样,该方法的最后一行应该是:

return 0;

相关内容

最新更新