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

вот код (java):

class prime
{

    public static boolean prime (int a, int b) 
    { 
        if (a == 0) 
        {
            return false; 
        }
        else if ((a%(b-1) == 0) && (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)

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


person David    schedule 10.03.2010    source источник


Ответы (4)


Попробуйте перевернуть это

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

to

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

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

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

person Tom    schedule 10.03.2010

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

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

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

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

person Tom Castle    schedule 10.03.2010

 A % B = C

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

person Alexander Petrov    schedule 12.09.2018

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

person spender    schedule 10.03.2010