Как заставить Java бросать арифметическое исключение?
Как заставить Java бросать арифметическое исключение при делении на 0,0 или извлечении корня из отрицательного двойника? Код следует:
double a = 1; // or a = 0 to test division by 0
double b = 2;
double c = 100;
double d = b*b - 4*a*c;
double x1 = (-b - Math.sqrt(d)) / 2 / a;
double x2 = (-b + Math.sqrt(d)) / 2 / a;
Ответы
Ответ 1
Невозможно заставить Java генерировать исключения для этих операций. Java реализует стандарт IEEE 754 для арифметики с плавающей запятой, который предписывает, чтобы эти операции возвращали определенные битовые комбинации со значением "Не число" или "Бесконечность". К сожалению, Java не реализует доступные для пользователя флаги состояния или обработчики прерываний, которые стандарт описывает для недопустимых операций.
Если вы хотите специально обработать эти случаи, вы можете сравнить результаты с соответствующими константами, такими как Double.POSITIVE_INFINITY
(для NaN вы должны использовать метод isNAN()
, потому что NaN! = NaN). Обратите внимание, что вам не нужно проверять после каждой отдельной операции, так как последующие операции сохранят значение NaN или Infinity. Просто проверьте конечный результат.
Ответ 2
Я думаю, вам нужно будет проверить вручную, например.
public double void checkValue(double val) throws ArithmeticException {
if (Double.isInfinite(val) || Double.isNaN(val))
throw new ArithmeticException("illegal double value: " + val);
else
return val;
}
Итак, для вашего примера
double d = checkValue(b*b - 4*a*c);
double x1 = checkValue((-b - Math.sqrt(d)) / 2 / a);
double x2 = checkValue((-b + Math.sqrt(d)) / 2 / a);
Ответ 3
Этот код выдает ArithmeticException
:
int x = 1 / 0;