我似乎无法使我的程序通过我自己实现的异常。我已经测试了它没有这个例外,它工作正常。但是出于某种原因,即使条件得到满足,我If
的{{1}}方法中的x {2}语句总是被执行(就像我使用5作为我的x值,这应该足够了)绕过这个并移动到方法的阶乘执行部分。)
我是创建自己的异常的新手,我只是想看看有经验的人是否可以指出我在这里做错了什么。对我来说,这应该是正确的。谢谢!
我已经在代码中评论了它应该绕过但却抛出异常。
factorial
答案 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)){
}