Java 如何修复“变量始终为真”或“。。。假'?

Java 如何修复“变量始终为真”或“。。。假'?,java,Java,我正在创建一个收费项目,对高速公路的某一路段收费。在某些时候,通行费是不同的。我开始编写这段代码,但在使用Intellij时,IDEA表示我的变量hours和min始终为真。在第一个“else-if”语句之后,其余的“else-if”语句表示整个条件始终为false。我猜我可能已经建立了一个无限循环也许?我被卡住了,需要一点推动才能前进。回报只是给出了这些特定时间的价格 /** * The method takes hour, minute, and "am", "pm" components

我正在创建一个收费项目,对高速公路的某一路段收费。在某些时候,通行费是不同的。我开始编写这段代码,但在使用Intellij时,IDEA表示我的变量hours和min始终为真。在第一个“else-if”语句之后,其余的“else-if”语句表示整个条件始终为false。我猜我可能已经建立了一个无限循环也许?我被卡住了,需要一点推动才能前进。回报只是给出了这些特定时间的价格

/**
 * 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块以返回结束,则不需要使用else

现在真正的问题是——你的第二个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语句都不匹配,那么您的方法仍然需要返回一个值——应该是什么值?在上述时间以外是否免费?如果是,则方法的最后一行应为:

return 0;

我根本看不到循环。如果小时不是在4到12之间,它显然不是在5到7或8到10之间。我想您想切换顺序。我强烈建议对所有if和else块使用{and}。它不需要太多的努力,但它更容易阅读和理解。如果小时数>12,您已经从第一行中的方法返回,因此检查小时数59,如果小时数>12,则返回语句后的min@MosesMinchuk;这是绝对可以保证的
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 (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 (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;
    }
}
return 0;