Разделение 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!");
}
}
}
Я понятия не имею!
Ответы
Ответ 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