自我实现的异常错误

时间:2015-06-29 21:07:04

标签: java

我似乎无法使我的程序通过我自己实现的异常。我已经测试了它没有这个例外,它工作正常。但是出于某种原因,即使条件得到满足,我If的{​​{1}}方法中的x {2}语句总是被执行(就像我使用5作为我的x值,这应该足够了)绕过这个并移动到方法的阶乘执行部分。)

我是创建自己的异常的新手,我只是想看看有经验的人是否可以指出我在这里做错了什么。对我来说,这应该是正确的。谢谢!

我已经在代码中评论了它应该绕过但却抛出异常。

factorial

4 个答案:

答案 0 :(得分:1)

这不是您想要创建自己的异常的情况。您的用例由NumberFormatException处理得很好。

这里的问题是这一行:

 if (x % 2 != 1.0 || x % 2 != 0.0)

这行不能很好地检查整数。

在这种情况下,您可以更好地将元素解析为Integer,并在 级别处理问题。

try {
    x = Integer.parseInt(JOptionPane.showInputDialog("Enter a non-negative whole number"));
    System.out.println(x);
}
catch (NumberFormatException nfe) {
    System.out.println("That's not a number! try again!");
    continue;
}

如果确实想要尝试使用您自己的异常,您可以尝试将值解析为方法内的int

public static double factorial(double x) throws NotAWholeNumber {

    try {
        Integer.parseInt(Double.toString(x));
    } catch (NumberFormatException e) {
        throw new NotAWholeNumber("Not a whole number!");
    }
    if (x == 1 || x == 0) {
        return 1;
    }

    return factorial(x - 1) * x;

}

...但是当你只应该做一次时,基本上就是做两次解析。

或者,如果您不介意一点自动装箱,那么您可以直接传递Double对象并将其intValue与其自身进行比较。

Double x, y
// other code
try {
    x = Double.valueOf(JOptionPane.showInputDialog("Enter a non-negative whole number"));
    System.out.println(x);
}

// other code

public static double factorial(Double x) throws NotAWholeNumber {
    if (x.intValue() - x != 0) {
        throw new NotAWholeNumber("Not a whole number!");
    }
    if (x == 1 || x == 0) {
        return 1;
    }
    return factorial(x - 1) * x;
}

答案 1 :(得分:0)

这一行中的条件:

if (x % 2 != 1.0 || x % 2 != 0.0)

表示:

if x is not an odd number, OR x is not an even number

任何x都是如此,因为任何东西都不是奇数而不是偶数。可能你的意思是&&而不是||,但是检查它仍然是一个特殊的条件。

答案 2 :(得分:0)

我运行了你的代码,我看到的唯一错误就是你对“整数”(整数)进行了错误的验证。 只是使用“或”(||)的逻辑错误。这里需要使用“和”(&&),因为正整数的MOD除法(%)返回1或0,因此,MOD除法(%)必须返回1 AND 0的数字。 / p>

public static double factorial(double x) throws NotAWholeNumber {

        if (x == 1 || x == 0) {
            return 1;
        }
        System.out.println(x % 2);
        if (x % 2 != 1.0 && x % 2 != 0.0) {
            throw new NotAWholeNumber("not a whole number");
        } else {
            double y = factorial(x - 1) * x;
            return y;
        }
    }

答案 3 :(得分:-1)

看起来如果语句错误,当x是整数时它将始终返回true,请尝试使用此条件:

if(!(x%2 == 1.0) && !(x%2 == 0.0)){
}