2010-03-10 89 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。