从应用程序开发团队的角度来看,如何处理诸如999999 * 999999(结果> Integer.MAX_VALUE)之类的整数溢出?
可以使BigInt
成为强制性的,并禁止使用Integer
,但这是一个好/坏主意吗?
最佳答案
如果整数不溢出非常重要,则可以定义自己的溢出捕捉操作,例如:
def +?+(i: Int, j: Int) = {
val ans = i.toLong + j.toLong
if (ans < Int.MinValue || ans > Int.MaxValue) {
throw new ArithmeticException("Int out of bounds")
}
ans.toInt
}
您可能可以使用“丰富您的图书馆”模式将其转变为运算符;如果JVM能够正确地进行转义分析,那么您将不会受到太多的惩罚:
class SafePlusInt(i: Int) {
def +?+(j: Int) = { /* as before, except without i param */ }
}
implicit def int_can_be_safe(i: Int) = new SafePlusInt(i)
例如:
scala> 1000000000 +?+ 1000000000
res0: Int = 2000000000
scala> 2000000000 +?+ 2000000000
java.lang.ArithmeticException: Int out of bounds
at SafePlusInt.$plus$qmark$plus(<console>:12)
...
如果不是很重要,那么在大多数情况下,标准的单元测试和代码审查等应可以解决该问题。可以使用
BigInt
,但会使您的算术速度降低100倍左右,并且在必须使用采用Int
的现有方法时将无济于事。
关于scala - 常见的做法是如何处理Integer溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9874999/