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

时间:2010-05-14 12:52:37

标签: 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)
}

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

5 个答案:

答案 0 :(得分:13)

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

ETA :来自语言规范:

  

“内置整数运算符没有   表示任何溢出或下溢   办法。唯一的数字运算符   可以抛出异常(§11)   整数除法运算符/(§15.17.2)   和整数余数运算符%   (§15.17.3),抛出一个   ArithmeticException如果是右手   操作数为零。“

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

答案 1 :(得分:3)

除了Jim所说的,检查溢出等条件会增加整数计算的性能损失,这会使执行大量计算的程序慢得多。

答案 2 :(得分:1)

另一个原因是你可以非常轻松快速地进行检查。

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

应该很好地完成这个技巧,因为你知道我总是积极而且小于Integer.MAX_VALUE。

答案 3 :(得分:0)

了解Integer.MAX_VALUE总是有用的:)

答案 4 :(得分:0)

因为我们的专业重视绩效而不是正确性。 ;(

默认情况下使用BigInteger,并且仅推断是否可接受,如果性能是真正的问题,则使用long或int将有助于避免此类问题。