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

gir*_*iri 7 java floating-point integer infinity

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

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

输出:b =无穷大.

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

pol*_*nts 12

简短的回答

积分类型(JLS 4.2.1)与浮点类型明显不同(JLS 4.2.3).在行为和操作方面可能存在相似之处,但也存在区别性差异,使得混淆两者可能导致许多陷阱.

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


关于积分和浮点值

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

  • byte:从-128127,包容性,即[-27, 27-1]
  • short:从-3276832767,包容性,即[-215, 215-1]
  • int:从-21474836482147483647,包容性,即[-231, 231-1]
  • long:从-92233720368547758089223372036854775807,包容性,即[-263, 263-1]
  • char'\u0000''\uffff'包容性的,也就是说,从065535,即[0, 216-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结果.

附录

这个已久的答案还没有涵盖很多问题,但鼓励读者浏览相关问题和参考资料.

相关问题


pax*_*blo 11

因为浮动实际上一个你想要计算的"数字"的表示.所以它使用它.整数没有这样的表示.

Java(主要)遵循IEEE754的浮点支持,请参阅此处了解更多详细信息.


归档时间:

查看次数:

489 次

最近记录:

15 年,3 月 前