常见的下溢和溢出exception
我试图在java中获得溢出和下溢exception,但无法获得任何好的教程。 具体来说,我想学习
- 他们彼此有什么不同?
- 这些例外的子类是什么?
- 在哪种情况下他们被抛出?
- 哪些可以处理以及如何处理?
- 与他们相关的最佳实践是什么?
任何有用教程的链接都可以
好的,OP谈到了想要了解堆栈溢出和算术溢出,以及它们相应的下溢。 开始….
- 当数字太大而无法适应其值类型时,会发生算术溢出。 例如,
int
包含介于-2 31和2 31 -1之间的值。 如果您的数字超过这些限制,则会发生溢出,并且数字“环绕”。 这些不会导致在Java中生成exception。 - 当浮点数太小而不能很好地区分零(被截断的数字的精度)时,会发生算术下溢。 在Java中,这些也不会导致exception。
- 当你调用一个函数调用另一个函数,然后调用另一个函数然后调用另一个函数时,会发生堆栈溢出…并且函数调用堆栈变得太深。 发生这种情况时会出现
StackOverflowError
。 - 堆栈下溢不会发生在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); } }
- 为什么我的NullPointerException没有被我的catch块捕获?
- 如何通过DocumentBuidlerFactory创建新的xml文件时生成ParserConfigurationException
- Android XML文件java.lang.nullpointerexception
- org.hibernate.exception.GenericJDBCException:无法执行查询
- exception处理模式
- 如何设置Eclipse以阻止exception发生?
- 未捕获的exception处理程序中未捕获的exception
- java.net.SocketException:网络无法访问:连接
- exception处理,创建日志并在JAVA中继续程序