3

我的代码将显示我这是不可接受的输入。如果我插入负数。然后继续提示输入。但它继续计算。这是我的代码的一部分包含错误。但我没有看到。

public static boolean checkOctal()
{
    boolean b = true;
    if (oct < 0 && oct > 99999999 )
    {
        b = false;
        System.out.println("That is not an acceptable input.");
    }
    int tmp;
    int tmp1 = oct;
    while (tmp1 > 0)
    {
        tmp = tmp1 % 10;
        tmp1 = tmp1 / 10;
        if (tmp >= 0 && tmp < 8)
        {
            continue;
        } else
        {
            b = false;
            break;
        }
    }
    return b;

}
4

3 回答 3

6

你应该写

if (oct < 0 || oct > 99999999 )

代替

if (oct < 0 && oct > 99999999 )

||代表或,而&&代表和。

于 2012-10-29T07:52:41.447 回答
5

实际上,我怀疑它是否显示任何内容。看情况:

if (oct < 0 && oct > 99999999 )

一个数字怎么可能同时是负数大体上是正数?你想要一个“或”条件。

接下来,如果您确实满足条件,请查看您在做什么:

{
    b = false;
    System.out.println("That is not an acceptable input.");
}

你只是继续前进 - 它会返回正确的结果(假),但它没有意义。你已经知道结果了,为什么不直接返回呢?

你要:

if (oct < 0 || oct > 99999999 )
{
    System.out.println("That is not an acceptable input.");
    return false;
}

或者,更好的是,更早地执行验证(在调用方法之前) - 如果输入无效,则抛出异常。目前,您为“无效输入”提供与“有效但非八进制输入”相同的结果,这对我来说听起来不是一个好主意。

请注意,“一知道值就返回”的方法也是我在其余方法中采用的方法——我根本不会为b变量而烦恼。我会把你的循环改成这样:

int value = oct;
while (value > 0)
{
    int digit = value % 10;
    if (digit >= 8)
    {
        return false;
    }
    value = value / 10;
}
return true;

您不必担心digit是否为负,因为您已经检查过您是否从非负值开始。

此外,这个方法没有oct作为参数似乎很奇怪。这将使它更加独立。

于 2012-10-29T07:53:40.933 回答
2

您可能应该检查您的布尔逻辑:

if (oct < 0 && oct > 99999999 )

永远不会是真的 - 没有任何数字同时小于零大于 999999... 符号||(逻辑“或”)是您所需要的。

干杯,

于 2012-10-29T07:53:36.437 回答