常见的下溢和溢出exception

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

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

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

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

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

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

在Java算法中,溢出或下溢永远不会抛出exception。 相反,对于浮点运算,该值设置Not a number ,“无限”或零。

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

 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"); } 

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

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

Java没有无符号整数。 如果您认为它可能有用,则可以轻松抛出exception。

 public class Counter { private int counter = 0; public int increment () { counter += 1; if (counter < 0) throw new RuntimeException ("Counter overflow"); else return counter; } public String toString() { return String.valueOf(counter); } }