Почему 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 не может мне это сказать? (например, за исключением)
Ответы
Ответ 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, если производительность является реальной проблемой, поможет избежать таких проблем.