对于一个小项目(问题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不能告诉我那个? (例如,例外)
答案 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将有助于避免此类问题。