Java 常见下溢和溢出异常

Java 常见下溢和溢出异常,java,exception,overflow,underflow,Java,Exception,Overflow,Underflow,我试图掌握java中的溢出和下溢异常,但没有得到任何好的教程。我特别想学习 它们之间有什么不同 这些异常的子类是什么 在哪种情况下抛出它们 哪些可以处理,如何处理 与之相关的最佳实践是什么 在Java算术中,任何指向有用教程的链接都可以,溢出或下溢都不会引发异常。相反,对于浮点运算,该值设置为“无限”或零 要测试这些,可以使用静态方法:或使用适当的包装器类。您可以根据需要处理此问题。例如: double d1 = 100 / 0.; if (Double.isNaN(d1)) { thr

我试图掌握java中的溢出和下溢异常,但没有得到任何好的教程。我特别想学习

  • 它们之间有什么不同
  • 这些异常的子类是什么
  • 在哪种情况下抛出它们
  • 哪些可以处理,如何处理
  • 与之相关的最佳实践是什么

  • 在Java算术中,任何指向有用教程的链接都可以

    ,溢出或下溢都不会引发异常。相反,对于浮点运算,该值设置为“无限”或零

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

    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");
    }
    
    对于某些操作,可以得到一个数值,例如整数数学中的
    除以零时


    我只是问了一个完整的项目风格的方法来处理这个问题。

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

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

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

    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); }
    }
    
    公共类计数器
    {
    专用整数计数器=0;
    公共整数增量()
    {
    计数器+=1;
    如果(计数器<0)
    抛出新的运行时异常(“计数器溢出”);
    其他的
    返回计数器;
    }
    公共字符串toString(){return String.valueOf(counter);}
    }
    
    由于这是一个非常古老的问题,应该注意的是,自Java 8以来,Math包提供了“精确”的算术方法,当溢出发生时将触发异常

    e、 g


    将触发java.lang.arithmetricException:整数溢出。

    谢谢您的否决票,有什么原因吗?它是被欺骗的、无关的、可维基的吗?我不是那个否决你的人,但是,你说的是什么样的上溢/下溢?算术?堆栈还有什么吗?我想从这两类异常开始。任何和所有对我都有用-1100/0实际上返回无穷大,而不是NaN。另外,算术下溢(非正规)只返回0。谢谢,我对BufferOverflowException和BufferUnderflowException以及相关的异常非常感兴趣stuff@RaviGupta-请将此添加到主要问题中-
    BufferOverflowException
    BufferUnderflowException
    比您原来的问题具体得多“溢出和下溢异常“问题。@拉维:这里没有
    BufferOverflowException
    之类的东西。数组是通过索引访问的,当索引变得无效时,会导致
    IndexOutOfBoundsException
    @Chris:它们有类似于BufferOverflowException+1的清晰解释。我也听说过从int.MIN_值中减去一个称为下溢。我以前没有遇到过你的第2点。@Paolo:我认为从
    整数中减去1.MIN\u值也被认为是溢出。但也许我在这里吹毛求疵。:-)@Chris谢谢,这很有帮助,我在哪里可以找到这些东西的文档?@Ravi:哇,我现在很难给你提供具体的参考资料,因为很多参考资料实际上来自个人经验(我用Java编程已经5年多了)。嗯。如果你对Java语言规范的本质感兴趣,你可以(也应该)试着阅读它。@Chris我曾试图在sun的网站上搜索它,但没有得到我想要的。我会继续找的,如果我找到了,我会把它贴在这里
    
    int iv1 = Integer.MAX_VALUE;
    int iv2 = Math.addExact(iv1,1);