2010-03-10 91 views
1

这里是代码(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) 

所以这意味着我将零分配一些如何正确?或者它意味着什么?我不明白我是如何除以零的。什么地方出了错?

回答

12

尝试关闭此周围

if ((a%(b-1) == 0) && (b>2)) 

if ((b>2) && a%(b-1)==0) 

发生了什么事是,a%(b-1)操作正在b>2测试之前执行。

切换后,您正在利用short-circuit evaluation。一旦b> 2测试返回错误,那么就没有必要计算模数(因此避免了除法)

+0

修正了它。谢谢你的帮助。 – David 2010-03-10 03:42:31

0

我认为x % 0这种形式的任何代码都会抛出这个错误。您的代码无法防范这种可能性。

2

因为你的递归调用:

return (prime (a, b-1)) ; 

你会在某个时候呼吁总理与1. B A值上,你将要测试的a%0你的第二个条件这意味着。由于模运算符(%)本质上是一个分水岭,所以将你的除数除以零。

解决方案可能是在执行%之前捕获此案例以在您的条件中执行b> 2。