web-dev-qa-db-fra.com

La division Java par zéro ne déclenche pas une exception arithmétique - pourquoi?

Pourquoi ce code ne jette pas une ArithmeticException? Regarde:

public class NewClass {

    public static void main(String[] args) {
        // TODO code application logic here
        double tab[] = {1.2, 3.4, 0.0, 5.6};

        try {
            for (int i = 0; i < tab.length; i++) {
                tab[i] = 1.0 / tab[i];
            }
        } catch (ArithmeticException ae) {
            System.out.println("ArithmeticException occured!");
        }
    }
}

Je n'ai aucune idée!

27
Katie

Pourquoi ne pouvez-vous pas le vérifier vous-même et renvoyer une exception si c'est ce que vous voulez?.

    try {
        for (int i = 0; i < tab.length; i++) {
            tab[i] = 1.0 / tab[i];

            if (tab[i] == Double.POSITIVE_INFINITY ||
                    tab[i] == Double.NEGATIVE_INFINITY)
                throw new ArithmeticException();
        }
    } catch (ArithmeticException ae) {
        System.out.println("ArithmeticException occured!");
    }
19
Waqas Ilyas

IEEE 754 définit 1.0 / 0.0 comme Infinity et -1.0 / 0.0 comme -Infinity et 0.0 / 0.0 comme NaN.

BTW Le point flottant a aussi -0.0 et donc 1.0/ -0.0 est -Infinity.

L'arithmétique entière n'a aucune de ces valeurs et lève une exception à la place.

Pour rechercher toutes les valeurs possibles, y compris NaN, 0.0 et -0.0 pouvant produire un nombre non fini, vous pouvez procéder comme suit.

if (Math.abs(tab[i] = 1 / tab[i]) < Double.POSITIVE_INFINITY)
   throw new ArithmeticException("Not finite");
61
Peter Lawrey

C'est parce que vous avez affaire à des nombres à virgule flottante. La division par zéro renvoie Infinity, qui est similaire à NaN (pas un nombre).

Si vous voulez éviter cela, vous devez tester tab[i] avant de l'utiliser. Ensuite, vous pouvez lancer votre propre exception, si vous en avez vraiment besoin.

17
gd1

0.0 est un double littéral et ceci n'est pas considéré comme un zéro absolu! Aucune exception, car on considère que la variable double est assez grande pour contenir les valeurs représentant l'infini

10
codeMan

Java ne lève pas d'exception si vous divisez par un zéro égal à zéro. Une erreur d'exécution ne sera détectée que si vous divisez par entier zéro et non double zéro.

Si vous divisez par 0.0, le résultat sera INFINITY.

6
Khalil

Lorsque divisé par zéro

  1. Si vous divisez le double par 0, JVM affichera Infinity .

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
    

    Console: Infinity

  2. Si vous divisez int par 0, alors la machine virtuelle Java lancera exception arithmétique .

    public static void main(String [] args){
        int a=10;
        System.out.println(a/0);
    }
    

    Console: Exception in thread "main" Java.lang.ArithmeticException: / by zero

2
Raman Gupta

Il y a une astuce, les exceptions arithmétiques se produisent lorsque vous jouez avec des intégrales et uniquement pendant/ou% opération. 

s'il y a un nombre à virgule flottante en opération arithmétique, toutes les intégrales seront converties en interne en virgule flottante. Cela peut vous aider à vous rappeler des choses facilement. 

0
Renjith R