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

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

6 ответов


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

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

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

BTW с плавающей точкой также имеет -0.0 и 1.0/ -0.0 is -Infinity.

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

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

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

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

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


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


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

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


при делении на ноль

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

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