当我不能使用Integer时,为什么Java没有告诉我?

Rof*_*ion 10 java math

对于一个小项目(问题10项目欧拉),我试图总结低于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)
}
Run Code Online (Sandbox Code Playgroud)

此计算的结果是1179908154,但这是不正确的.所以我将int更改为BigInteger,现在我得到了正确的总和142913828922.显然int的范围溢出了.但是为什么Java不能告诉我那个?(例如,例外)

Jim*_*ley 13

因为可以想象您可能希望它以传统的整数方式运行.例外情况保留用于明确且不可逆转的错误.

ETA:从语言规范:

"内置整数运算符不以任何方式表示溢出或下溢.唯一可以抛出异常的数字运算符(第11节)是整数除运算符/(第15.17.2节)和整数余数运算符%(§ 15.17.3),如果右侧操作数为零,则抛出ArithmeticException."

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

  • 如果你知道你的数字可能很大,你应该使用一个"更大"的类来处理它. (4认同)
  • `因为可以想象你可能希望它以传统的整数方式运行.可以想象你只需要传统方法中的任何便利功能(例如超越数组边界).我们之所以不这样做是因为**使普通情况的默认值比绝对功率**重要得多. (3认同)
  • @Jim Kiley - 或者`Long` /`long`,对于大于整数范围的数字,但绝对总是在longs(`Long.MAX_LONG`~ = 2 ^ 63)的范围内,将是一个更自然的替代品.这并不是说'BigInteger'没用,但它们更专业. (2认同)