Как заставить Java бросить арифметическое исключение? - PullRequest
12 голосов
/ 17 февраля 2010

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

Ответы [ 3 ]

12 голосов
/ 17 февраля 2010

Невозможно сделать исключения Java для этих операций, потому что Java реализует стандарт IEEE 754 для арифметики с плавающей запятой, который требует, чтобы эти операции возвращали конкретные битовые комбинации со значением «Не число» или "Бесконечность".

Если вы хотите специально обработать эти случаи, вы можете сравнить результаты с соответствующими константами, такими как Double.POSITIVE_INFINITY (для NaN вы должны использовать метод isNAN(), потому что NaN! = NaN). Обратите внимание, что вам не нужно проверять после каждой отдельной операции, так как последующие операции сохранят значение NaN или Infinity. Просто проверьте конечный результат.

2 голосов
/ 17 февраля 2010

Я думаю, вам придется проверять вручную, например,

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);
0 голосов
/ 17 февраля 2010

Этот код будет выбрасывать ArithmeticException:

int x = 1 / 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...