Почему Java не говорит мне, когда я не могу использовать Integer? - PullRequest
10 голосов
/ 14 мая 2010

Для небольшого проекта (задача 10 Project Euler) я попытался суммировать все простые числа ниже 2 миллионов. Поэтому я использовал метод грубой силы, перебрал от 0 до 2 000 000 и проверил, простое ли число. Если это так, я добавил его к сумме:

private int sum = 0;

private void calculate() {
   for (int i = 0; i < 2000000; i++) {
      if (i.isPrime()) {
         sum = sum + i;
      }
   }
   sysout(sum)
}

Результат этого расчета 1179908154, но это неверно. Поэтому я изменил int на BigInteger и теперь я получаю правильную сумму 142913828922. Очевидно, диапазон int был переполнен. Но почему Java не может сказать мне это? (например, исключением)

Ответы [ 5 ]

13 голосов
/ 14 мая 2010

Потому что вполне возможно, что вы захотите, чтобы он вел себя традиционным целочисленным образом. Исключения зарезервированы для вещей, которые определенно и безвозвратно ошибочны.

ETA : из спецификации языка:

"Встроенные целочисленные операторы не указывает на переполнение или недополнение в любом путь. Единственные числовые операторы, которые может бросить исключение (§11) целочисленный оператор деления / (§15.17.2) и оператор целочисленного остатка% (§15.17.3), которые бросают ArithmeticException, если правая рука операнд равен нулю. "

(http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html)

3 голосов
/ 14 мая 2010

Помимо того, что говорит Джим, проверка таких условий, как переполнение, добавит снижение производительности к любым вычислениям, выполненным с целыми числами, что сделает программы, выполняющие много вычислений, намного медленнее.

1 голос
/ 14 мая 2010

Другая причина в том, что вы можете сделать эту проверку сами очень легко и быстро.

if (sum+i < sum) {
  throw new AritchmeticException();
}

должно хорошо справиться с задачей, учитывая, что вы знаете, что я всегда положительный и меньше чем Integer.MAX_VALUE.

0 голосов
/ 18 мая 2010

Потому что наша профессия ценит производительность выше корректности. ; (

Использование BigInteger по умолчанию и только рассуждение о том, допустимо ли использование long или int, если производительность является реальной проблемой, поможет избежать таких проблем.

0 голосов
/ 14 мая 2010

Знание Integer.MAX_VALUE всегда полезно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...