разделитесь на нулевую ошибку

вот код (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)

Таким образом, это означает, что я разделил на нуль некоторых как правильный? или это означает что-то еще? Я не вижу, как я делюсь на нуль. Что пошло не так, как надо?

5
задан Aziz Shaikh 1 October 2012 в 09:45
поделиться

3 ответа

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

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

на

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

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

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

15
ответ дан 18 December 2019 в 09:06
поделиться

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

0
ответ дан 18 December 2019 в 09:06
поделиться

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

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

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

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

2
ответ дан 18 December 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: