ошибка деления на ноль

#java #divide-by-zero

#java #деление на ноль

Вопрос:

вот код (java):

 class prime
{

    public static boolean prime (int a, int b) 
    { 
        if (a == 0) 
        {
            return false; 
        }
        else if ((a%(b-1) == 0) amp;amp; (b>2))
        {
            return false; 
        }
        else if (b>1) 
        {
            return (prime (a, b-1)) ;
        }
        else
        {
            return true; 
        }

    }

    public static void main (String[] arg) 
    {
        System.out.println (prime (7, 7)) ; 
    }
}
  

Это сообщение об ошибке, которое я получаю при попытке запустить его (оно отлично компилируется):

 Exception in thread "main" java.lang.ArithmeticException: / by zero
    at prime.prime(prime.java:10)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.main(prime.java:27)
  

Итак, это означает, что я разделил на ноль, насколько это правильно? или это означает что-то другое? Я не понимаю, как я делю на ноль. Что пошло не так?

Ответ №1:

Попробуйте изменить это

 if ((a%(b-1) == 0) amp;amp; (b>2))
  

Для

    if ((b>2) amp;amp; a%(b-1)==0)
  

Происходит то, что a%(b-1) операция выполняется перед b>2 тестированием.

После переключения вы используете в своих интересах вычисление короткого замыкания. Как только тест b> 2 возвращает false, тогда нет необходимости вычислять модуль (следовательно, избегая деления)

Ответ №2:

Из-за вашего рекурсивного вызова:

 return (prime (a, b-1)) ;
  

В какой-то момент вы будете вызывать prime со значением для b, равным 1. Это означает, что по вашему второму условию вы будете проводить тестирование a%0 . Поскольку оператор по модулю (%) по сути является делением, это приводит к проблеме с делением на ноль.

Вероятно, решение состоит в том, чтобы перехватить этот случай, чтобы принудительно использовать b > 2 в вашем условии, прежде чем выполнять %.

Ответ №3:

  A % B = C
  

Математический смысл % заключается в том, что вы делите A на B , и напоминанием об этой операции является C . Когда B это 0 , вы эффективно спрашиваете: что является напоминанием, когда мы делим на ноль?. Однако в математике деление на ноль не определено, и это является причиной java.lang.ArithmeticException

Ответ №4:

Я предполагаю, что любой код формы x % 0 выдаст эту ошибку. Ваш код не защищает от такой возможности.