常见的下溢和溢出异常

时间:2010-01-28 13:16:57

标签: java exception overflow underflow

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

  1. 他们彼此有什么不同?
  2. 这些例外的子类是什么?
  3. 在哪种情况下会被抛出?
  4. 哪些可以处理以及如何处理?
  5. 与他们有关的最佳做法是什么?
  6. 任何有用教程的链接都可以

4 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分: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");
}

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

我刚刚问related question一个完整的项目风格方式来处理这个问题。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

由于这是一个非常古老的问题,需要注意的是,从 Java 8 开始,Math 包提供了“精确”的算术方法,当发生溢出时会触发异常。

例如

<input id="importfile" asp-for="ImportFile" type="file" accept=".xls, .xlsx" />

public IFormFile ImportFile { set; get; }

会触发 java.lang.ArithmeticException: integer overflow .