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

Для маленького проекта (проблема 10 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, но это неправильно. Таким образом, я изменил интервал на BigInteger, и теперь я получаю корректную сумму 142913828922. Очевидно, диапазон интервала был переполнен. Но почему Java не может сказать мне это? (например, исключением)

10
задан Zero Piraeus 22 January 2015 в 18:15
поделиться

5 ответов

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

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

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

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

13
ответ дан 3 December 2019 в 21:20
поделиться

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

3
ответ дан 3 December 2019 в 21:20
поделиться

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

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

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

1
ответ дан 3 December 2019 в 21:20
поделиться

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

0
ответ дан 3 December 2019 в 21:20
поделиться

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

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

0
ответ дан 3 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

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