在Java中,当继续增加Byte
值并且超过大小容量时,为什么不抛出任何运行时异常?例如:
public static void main(String[] args) {
byte b = 127;
++b;
System.out.println(b);
}
以上代码将打印-128
。如果抛出RuntimeException
会不会更好?为什么这样设计?
对于Integer
:
int c = 2147483647;
++c;
System.out.println(c);
以上代码打印-2147483648
。
答案 0 :(得分:7)
整数溢出实际上在计算中非常有用。如果它抛出异常,许多聪明的算法会突然破坏或变得不切实际。例如,涉及定点算术的任何事情都会突然受到例外的困扰。
问题是,溢出通常不是问题,因为我们对程序设置限制以防止它发生(如果它会导致问题)。其他时候,我们设计程序来专门利用它。
不要将溢出视为“超过其最大尺寸的值”。这在技术上是不可能的。这些位简单地环绕并保持在该数据类型的限制范围内。
如果您需要检查溢出并想要生成异常,可以执行以下操作:
byte b = 127;
byte oldb = b;
b++;
if( b < oldb ) {
// Calamity!!! Raise an exception!
}
不要害怕你的整数限制。学会理解并与他们合作。
答案 1 :(得分:1)
在JVM Specs中声明:“尽管可能发生溢出,但执行iadd指令永远不会引发运行时异常。”
答案 2 :(得分:0)
整数和浮点运算的工作方式基于C中相同的操作如何工作,这基于CPU通常如何工作。溢出或下溢不会触发异常(其他有标记,遗憾的是java无法访问)只有一个操作触发异常,并且整数除以零会触发许多类型的cpus上的处理器中断。浮点除以零被定义为非数字,因此不会触发中断。