2010-03-10 6 views
1

voici le code (java):division par zéro erreur

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)) ; 
    } 
} 

Voici le message d'erreur que je reçois lorsque je tente de l'exécuter (il compile bien):

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) 

Donc, ce signifie que j'ai divisé par zéro certains à quel point? ou cela signifie-t-il autre chose? Je ne vois pas comment je divise par zéro. Qu'est ce qui ne s'est pas bien passé?

Répondre

12

Essayez renverser cette

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

à

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

Ce qui se passe est que l'opération a%(b-1) est en cours d'exécution avant le test b>2. Après le changement, vous exploitez short-circuit evaluation. Une fois que le test b> 2 renvoie false, il n'est pas nécessaire de calculer le module (évitant ainsi la division)

+0

qui l'a corrigé. Merci de votre aide. – David

0

Je suppose que tout code de la forme x % 0 va lancer cette erreur. Votre code ne protège pas contre cette possibilité.

2

En raison de votre appel récursif:

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

Vous à un moment donné convoquerons premier avec une valeur de b 1. Ce qui signifie que votre deuxième condition que vous allez tester a%0. Puisque l'opérateur modulo (%) est essentiellement une division, cela amène votre problème de division par zéro.

La solution est probablement d'attraper ce cas pour appliquer b> 2 dans votre état avant de faire le%.

Questions connexes