繁体   English   中英

为什么使用整型变量会抛出异常?

[英]Why does the use of integer variables throw an exception?

我遇到了以下两个代码。 为什么它不抛出浮点异常,而在其他情况下它会抛出运行时异常。

class FloatingPoint
    {
      public static void main(String [] args)
       {
         float a=1000f;
         float b=a/0;
        System.out.println("b=" +b);
       }
    }

输出:b=无穷大

如果我尝试使用 int 值,那么它会抛出运行时异常。 为什么会这样?

简短的回答

整型类型 ( JLS 4.2.1 ) 与浮点类型 ( JLS 4.2.3 ) 截然不同。 在行为和操作上可能有相似之处,但也存在特征上的区别,将两者混淆可能会导致许多陷阱。

除以零时的行为差异只是这些差异之一。 因此,简短的回答是 Java 的行为方式是因为语言是这样说的。


关于整数和浮点值

整数类型的值是以下范围内的整数:

  • byte :从-128127 ,包括在内,即[-2 7 , 2 7 -1]
  • short :从-3276832767 ,包括在内,即[-2 15 , 2 15 -1]
  • int : 从-21474836482147483647 ,包括在内,即[-2 31 , 2 31 -1]
  • long :从-92233720368547758089223372036854775807 ,包括在内,即[-2 63 , 2 63 -1]
  • char ,从'\''\￿'包含,即从065535 ,即[0, 2 16 -1]

浮点类型是floatdouble ,它们在概念上与单精度 32 位和双精度 64 位格式IEEE 754值和操作相关联。

它们的值按从最小到最大的顺序排列如下:

  • 负无穷大,
  • 负有限非零值,
  • 正负零(即0.0 == -0.0 ),
  • 正有限非零值,和
  • 正无穷大。

此外,还有特殊的Not-a-Number ( NaN ) 值,它们是无序的 这意味着如果其中一个(或两个!)操作数是NaN

  • 数值比较运算符<<=>>=返回false
  • 数值相等运算符==返回false
  • 数值不等式运​​算符!=返回true

特别是, x != xtrue当且仅当xNaN

例如double ,无穷大和NaN可以被称为:

这种情况类似于floatFloat


关于何时可能抛出异常

在这些情况下,数值运算可能只抛出Exception

  1. NullPointerException ,如果需要对null引用进行拆箱转换
  2. ArithmeticException ,如果整数除法/余数运算的右侧为零
  3. OutOfMemoryError ,如果需要装箱转换且内存不足

它们按重要性排序,因为它们是陷阱的常见来源。 通常来说,一般来说:

  • 对框类型要特别小心,就像所有其他引用类型一样,它们可能为null
  • 对整数除法/余数运算的右侧要特别小心
  • 算术上溢/下溢不会导致抛出异常
  • 精度损失不会导致抛出异常
  • 数学上不确定的浮点运算不会导致抛出异常

除以零

对于整数运算:

  • 如果右侧为零,除法和余数运算会抛出ArithmeticException

对于浮点运算:

  • 如果左操作数为NaN0 ,则结果为NaN
  • 如果运算是除法,则溢出,结果为有符号无穷大
  • 如果运算为余数,则结果为NaN

所有浮点运算的一般规则如下:

  • 溢出的操作会产生有符号无穷大。
  • 下溢操作会产生非规范化值或有符号零。
  • 没有数学上确定结果的运算会产生NaN
  • 所有以NaN作为操作数的数值运算都会产生NaN作为结果。

附录

这个已经很长的答案还有很多问题没有涉及,但鼓励读者浏览相关问题和参考资料。

相关问题

由于彩车事实上对“数字”表示你想计算。 所以它使用那个。 整数没有这样的表示。

Java(主要)遵循 IEEE754 以提供浮点支持,有关更多详细信息,请参见此处

这是因为整数算术总是包装它的结果,除了(除数/余数为零)的情况。
在浮点数的情况下,当出现上溢或下溢时,包装会变为 0、无穷大或 NaN。
在上溢期间,它给出无穷大,而在下溢期间,它给出 0。
再次有正和负上溢/下溢。
尝试:

float a = -1000;
float b = a/0;
System.out.println("b=" +b);

这给出了一个负溢出

输出

b=-无穷大

同样,正下溢将导致 0,负下溢将导致 -0。
某些操作也可能导致浮点/双精度返回 NaN(非数字)。
例如:

float a = -1000;
double b = Math.sqrt(a);
System.out.println("b=" +b);

输出

b=NaN

它是用零值表示 / 的编程和数学标准。 float 支持在 JAVA 中表示这些值。 int(整数)数据类型在 JAVA 中无法表示相同。

查看 :

http://en.wikipedia.org/wiki/Division_by_zero

http://www.math.utah.edu/~pa/math/0by0.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM