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