我的布尔语句以一种方式工作,但不是以一种看似不变的方式

时间:2013-06-30 10:40:15

标签: java boolean

为了让我的代码更美观和简短,我试图改变我的代码:

do
{
    System.out.print("Enter day: ");
    day = input.nextInt();

    if ((isLeapYear && month == 2 && (day < 1 || day > 29)) ||
            (!isLeapYear && month == 2 && (day < 1 || day > 28)) ||
            ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) ||
            ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
            month == 10 || month ==12) && (day < 1 || day > 30)))
    {
        System.out.println("Invalid input");
    }
}
while ((isLeapYear && month == 2 && (day < 1 || day > 29)) ||
        (!isLeapYear && month == 2 && (day < 1 || day > 28)) ||
        ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) ||
        ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
        month == 10 || month ==12) && (day < 1 || day > 30)));

到此:

boolean invalidDay = (isLeapYear && month == 2 && (day < 1 || day > 29)) ||
                    (!isLeapYear && month == 2 && (day < 1 || day > 28)) ||
                    ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) ||
                    ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
                    month == 10 || month ==12) && (day < 1 || day > 30));

do
{
    System.out.print("Enter day: ");
    day = input.nextInt();

    if (invalidDay)
    {
        System.out.println("Invalid input");
    }
}
while (invalidDay);

第二种方法不能按预期工作,但第一种方式完美无缺。我唯一改变的是将long boolean表达式放入一个布尔变量中。感谢。

4 个答案:

答案 0 :(得分:1)

while()中的

invalidDay 永远不会重新计算,您需要以某种方式提升其值

答案 1 :(得分:0)

您从控制台获取day值并检入循环,通过使用boolean变量,每次都不会执行检查,但前一个值仍然存在。如果你想在一个函数中做同样的事情,并从循环内部调用它。

答案 2 :(得分:0)

你在表达式的开头缺少一个开括号,而在表达式结尾处缺少一个结束括号......它应该是

boolean invalidDay = ((isLeapYear && month == 2 && (day < 1 || day > 29)) ||
                    (!isLeapYear && month == 2 && (day < 1 || day > 28)) ||
                    ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) ||
                    ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
                    month == 10 || month ==12) && (day < 1 || day > 30)));

答案 3 :(得分:-1)

在while循环中,参数invalidDay永远不会更新。您可以为无效日创建方法。这里:

public boolean invalidDay(int day) {
    return (isLeapYear && month == 2 && (day < 1 || day > 29)) ||
                (!isLeapYear && month == 2 && (day < 1 || day > 28)) ||
                ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) ||
                ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
                month == 10 || month ==12) && (day < 1 || day > 30));
}

现在,在你的while循环中,使用:

while(invalidDay(n));

其中n是一天。