这是代码(java):
class prime
{
public static boolean prime (int a, int b)
{
if (a == 0)
{
return false;
}
else if ((a%(b-1) == 0) && (b>2))
{
return false;
}
else if (b>1)
{
return (prime (a, b-1)) ;
}
else
{
return true;
}
}
public static void main (String[] arg)
{
System.out.println (prime (7, 7)) ;
}
}
这是我尝试运行时收到的错误消息(编译正常):
Exception in thread "main" java.lang.ArithmeticException: / by zero
at prime.prime(prime.java:10)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.main(prime.java:27)
所以这意味着我分零了一些怎么回事?或者它意味着什么?我不知道我是如何除以零的。什么地方出了错?
答案 0 :(得分:14)
尝试转过来
if ((a%(b-1) == 0) && (b>2))
到
if ((b>2) && a%(b-1)==0)
正在发生的事情是a%(b-1)
操作正在b>2
测试之前执行。
切换后,您正在利用short-circuit evaluation。一旦b> 2测试返回false,则无需计算模数(因此避免划分)
答案 1 :(得分:2)
由于你的递归电话:
return (prime (a, b-1)) ;
您将在某个时候使用b为1的值调用prime。这意味着在第二个条件下,您将测试a%0
。由于模运算符(%)本质上是一个除法,这就是将你的除以零问题。
解决方案可能是抓住这种情况来强制执行b>在做%之前你的情况是2。
答案 2 :(得分:0)
我假设x % 0
形式的任何代码都会抛出此错误。您的代码无法防范这种可能性。
答案 3 :(得分:0)
A % B = C
%
的数学意义是将A
除以B
,此操作的提示为C
。当B
为0
时,您有效地问我们除以零时的提示是什么。在数学中,尽管除数没有定义,这是java.lang.ArithmeticException