Подтвердить что ты не робот

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

Для небольшого проекта (проблема 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 не может мне это сказать? (например, за исключением)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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