【问题标题】:How to cause an exception on integer overflow? [duplicate]如何导致整数溢出异常? [复制]
【发布时间】:2016-08-07 09:43:32
【问题描述】:

如果我除以零,我会得到一个 java.lang.ArithmeticException,如下例所示:

int a = 3/0;

我想让它使整数溢出也会导致异常。所以下面的程序会抛出异常而不是打印 -2147483648。

public static void main(String[] args) {
    int a = Integer.MAX_VALUE + 1;
    System.out.println( a );
}

我知道我可以使用 BigInteger,它不会溢出并且仅受可用内存的限制。

我知道我可以创建自己的add 函数来检查溢出。或者我可以使用 Java 8 Math.addExact

我意识到我要求的行为与JLS at 15.18.2相反

如果整数加法溢出,则结果为低位 一些足够大的数学和的位 二进制补码格式。如果发生溢出,则 结果与两者的数学和的符号不同 操作数值。

除了修改 JVM 的源代码并使用这种修改后的 JVM。有什么办法可以做到这一点?甚至修改 JVM 的源代码也不够,因为库可能依赖于这种行为,我不希望它们受此影响,只有我的代码。

【问题讨论】:

    标签: java exception


    【解决方案1】:

    我很抱歉这么说,但你不能。

    如您所说,唯一的解决方案是编写您自己的函数或使用Math#addExact

    【讨论】:

    • 为什么不检查下一个值是否会导致溢出? if (x > Integer.MAX_VALUE - 1) { throw new Exception("Overflow"); }
    • 我认为他想要一种方法来检查是否发生了溢出,而无需自己编写逻辑。使用 Math#addExact,这是可能的。
    • 除此之外,看看 [Math#addExact(int, int)]() 中的代码,它并不是那么简单(例如,如果 ab 足够大,a + b也可以是> 0)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多