#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
выдаст эту ошибку. Ваш код не защищает от такой возможности.