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

Как заставить 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;
4b9b3361

Ответ 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;