我试图在Java中掌握溢出和下溢异常,但是找不到任何好的教程。具体来说,我希望了解以下内容:
- 它们之间有什么不同?
- 这些异常的子类有哪些?
- 在哪种情况下会抛出它们?
- 它们中的哪些可以处理,如何处理?
- 与它们相关的最佳实践是什么?
任何有用的教程链接都可以。
我试图在Java中掌握溢出和下溢异常,但是找不到任何好的教程。具体来说,我希望了解以下内容:
任何有用的教程链接都可以。
好的,OP想知道堆栈溢出和算术溢出以及它们的相应下溢的情况。以下是详细解释:
int
类型的值范围在-231到231-1之间(包括两端)。如果您的数字超出了这些限制,就会发生溢出,并且数字“重新开始”。在Java中,这不会引发异常。StackOverflowError
。回答OP的另一个问题(请参见评论),当您越过数组的边界时,会发出IndexOutOfBoundsException
。
Integer.MIN_VALUE
减去1也被认为是一种溢出。但也许我在这里太过苛求了。 :-) - C. K. YoungNaN(不是一个数字)
、'无穷大'或零。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");
}
在某些操作中,您可能会遇到算术异常,例如在整数运算中除以零
时。
我刚刚问了一个相关问题,关于如何以完整的项目方式处理这个问题。
BufferOverflowException
和 BufferUnderflowException
比您最初模糊的“溢出和下溢异常”问题更具体。 - Nateint iv1 = Integer.MAX_VALUE;
int iv2 = Math.addExact(iv1,1);
会触发 java.lang.ArithmeticException:整数溢出。
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); }
}