常见的下溢和溢出异常

Rav*_*pta 13 java exception overflow underflow

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

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

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

Chr*_*ung 26

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

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

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


Poo*_*ool 6

在Java算法中,溢出或下溢永远不会抛出异常.相反,对于浮点运算,该值设置为Not a number"无限"或零.

要测试这些,可以使用静态方法: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");
}
Run Code Online (Sandbox Code Playgroud)

对于某些操作,您可以获得ArithmeticException,例如dividing by zero在Integer数学中.

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