【问题标题】:divide by zero error除以零误差
【发布时间】:2010-03-10 03:09:58
【问题描述】:

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

所以这意味着我除以零一些正确吗?还是有别的意思?我不明白我是如何除以零的。什么地方出了错?

【问题讨论】:

    标签: java divide-by-zero


    【解决方案1】:

    试着扭转局面

    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,则无需计算模数(因此避免了除法)

    【讨论】:

      【解决方案2】:

      因为你的递归调用:

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

      您将在某个时候调用素数,其 b 值为 1。这意味着在您的第二种情况下,您将测试 a%0。由于模运算符 (%) 本质上是一个除法,这会带来除以零的问题。

      解决方案可能是在执行 % 之前捕获这种情况以在您的条件下强制执行 b > 2。

      【讨论】:

        【解决方案3】:
         A % B = C
        

        %的数学意义是你把A除以B,这个运算的提示符是C。当B0 时,您实际上会问:当我们除以零时会提示什么?但在数学中,除以零是未定义的,这就是 java.lang.ArithmeticException

        的原因

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-03-17
            • 1970-01-01
            • 1970-01-01
            • 2019-05-01
            • 2013-06-10
            • 1970-01-01
            相关资源
            最近更新 更多