Подтвердить что ты не робот

Разделение Java на ноль не генерирует исключение ArithmeticException - почему?

Почему этот код не бросает ArithmeticException? Посмотрите:

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

Я понятия не имею!

4b9b3361

Ответ 1

Почему вы не можете просто проверить это самостоятельно и выбросить исключение, если это то, что вы хотите.

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

Ответ 2

IEEE 754 определяет 1.0 / 0.0 как бесконечность и -1.0 / 0.0 как -Infinity и 0.0 / 0.0 как NaN.

BTW Плавающая точка также имеет -0.0, и поэтому 1.0/ -0.0 - -Infinity.

Целочисленная арифметика не имеет ни одного из этих значений и вместо этого генерирует исключение.

Чтобы проверить все возможные значения, включая NaN, 0.0, -0.0, которые могут создавать не конечное число, вы можете сделать следующее.

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

Ответ 3

Это потому, что вы имеете дело с числами с плавающей запятой. Деление на ноль возвращает Infinity, что похоже на NaN (а не число).

Если вы хотите предотвратить это, вы должны протестировать tab[i] перед его использованием. Тогда вы можете бросить свое собственное исключение, если оно вам действительно нужно.

Ответ 4

0.0 является двойным литералом, и это не считается абсолютным нолем! Никакого исключения, поскольку считается, что двойная переменная достаточно велика для хранения значений, представляющих почти бесконечность!

Ответ 5

Java не будет генерировать исключение, если вы разделите его на float zero. Он обнаружит ошибку во время выполнения, только если вы разделите на целое число ноль, а не на два нуля.

Если вы разделите на 0.0, результатом будет INFINITY.

Ответ 6

При делении на нуль

  • Если вы разделите double на 0, JVM покажет Бесконечность.

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

    Консоль: Infinity

  • Если вы разделите int на 0, тогда JVM выкинет Арифметическое исключение.

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

    Консоль: Exception in thread "main" java.lang.ArithmeticException: / by zero