常见的下溢和上溢异常

2022-09-04 05:57:38

我试图在java中获得溢出和下溢异常,但无法获得任何好的教程。具体来说,我希望学习

  1. 它们彼此之间有何不同?
  2. 这些例外的子类是什么?
  3. 在哪种情况下会抛出它们?
  4. 哪些可以处理,如何处理?
  5. 与它们相关的最佳实践是什么?

任何指向有用教程的链接都可以


答案 1

好吧,OP谈到了想要了解堆栈溢出和算术溢出,以及它们相应的下溢。来了....

  1. 当数字变得太大而无法适应其值类型时,就会发生算术溢出。例如,an 保存的值介于 -231 和 231-1 之间(包括 -2 31-1)。如果您的号码超过这些限制,则会发生溢出,并且该号码会“环绕”。这些不会导致在 Java 中生成异常。int
  2. 当浮点数太小而无法很好地区分零(数字的精度被截断)时,就会发生算术下溢。在Java中,这些也不会导致异常。
  3. 堆栈溢出发生在您调用一个函数时,该函数调用另一个函数,然后调用另一个函数,然后调用另一个函数...并且函数调用堆栈变得太深。当这种情况发生时,你会得到一个。StackOverflowError
  4. 堆栈下溢在 Java 中不会发生。它的运行时系统应该防止这种事情发生。

为了回答OP的另一个问题(参见注释),当你越过数组的边界时,会发出一个。IndexOutOfBoundsException


答案 2

在 Java 算术中,溢出或下溢永远不会引发异常。相反,对于浮点算术,该值设置为非数字,“无限”或零。

若要测试这些方法,可以使用静态方法:isNaNisInfinite,使用适当的包装类。您可以根据需要处理此问题。例:

double d1 = 100 / 0.;
if (Double.isNaN(d1)) {
    throw new RuntimeException("d1 is not a number");
}
if (Double.isInfinite(d1)) {
    throw new RuntimeException("d1 is infinite");
}

对于某些操作,您可以获得算术异常,例如在整数数学中。dividing by zero

我刚刚问了一个相关的问题,关于一个完整的项目风格方法来处理这个问题。