Java - Cannot Catch ArithmeticException при делении на ноль

Должно быть, я сделал что-то глупое здесь. Но я не могу понять, почему этот простой код не работает. InputMismatchException работает, но ArithmeticException никогда не перехватывается.

import java.util.InputMismatchException;
import java.util.Scanner;
public class SubChap02_DivisionByZero {
    public static double quotient(double num, double denum) throws ArithmeticException {
        return num / denum;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double num, denum, result;
        boolean continueLoop = true;
        do {
            try {
                System.out.printf("Please enter the numerator: ");
                num = scanner.nextFloat();
                System.out.printf("Please enter the denumerator: ");
                denum = scanner.nextFloat();
                result = quotient(num, denum);
                continueLoop = false;
                System.out.printf("THIS: %.2f/%.2f is %.2f\n", num, denum, result);    
                scanner.close();
          } catch (ArithmeticException arithmeticException) {
              System.err.printf("Exception : %s\n", arithmeticException);
              scanner.nextLine();
              System.out.println("You can try again!");
          } catch (InputMismatchException inputMismatchException) {
              System.err.printf("Exception : %s\n", inputMismatchException);
              scanner.nextLine();
              System.out.println("You can try again!");
          }
      } while (continueLoop == true);
    }
}

person Adhiputra Perkasa    schedule 29.01.2015    source источник
comment
и дайте мне подсказку, что вы делаете, чтобы иметь ArithmeticException?   -  person user902383    schedule 29.01.2015


Ответы (3)


Если вы ожидаете, что ArithmeticException будет выброшено при делении на 0,0, этого не произойдет. Деление двойного числа на 0 возвращает Double.POSITIVE_INFINITY (деление положительного двойного числа на 0,0), Double.NEGATIVE_INFINITY (деление отрицательного двойного числа на 0,0) или Double.NaN (деление 0,0 на 0,0).

Деление int на 0 даст вам это исключение.

person Eran    schedule 29.01.2015
comment
Вау, это ново для меня. Поменял на int и все работает. Большое спасибо ! - person Adhiputra Perkasa; 29.01.2015

Это потому, что вы не генерируете исключение, скорее всего, вы пытаетесь разделить число на 0. Поскольку вы используете float, эта операция разрешена. В результате вы получите Infinity или NaN

если вы измените свой ввод на целое число, тогда у вас будет исключение

person user902383    schedule 29.01.2015

ArithmaticException не вызывается для деления числа с плавающей запятой на ноль. Это будет работать с целочисленным делением. Подробнее см. этот ответ .

person monolyth421    schedule 29.01.2015