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

时间:2010-08-01 04:32:38

标签: 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);
       }
    }

输出:B =无限

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

4 个答案:

答案 0 :(得分:12)

简短回答

整数类型(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,从'\u0000''\uffff',包括065535,即[0, 2 {{ 1}} 16

浮点类型为-1]float,它们在概念上与单精度32位和双精度64位格式IEEE 754值和运算相关联。

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

  • 负无穷大,
  • 负有限非零值,
  • 正负零(即double),
  • 正有限非零值,
  • 正无穷大。

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

  • 数值比较运算符NaN<<=>返回>=
  • 数字相等运算符false返回==
  • 数值不等运算符false返回!=

当且仅当truex != x时,truex

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

情况类似于NaNFloat


当可能抛出异常时开启

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

  1. Exception,如果需要对NullPointerException引用进行拆箱转换
  2. null,如果整数除法/余数操作的右侧为零
  3. ArithmeticException,如果需要装箱转换且内存不足
  4. 关于陷阱的常见来源,它们按重要性排序。一般来说:

    • 特别注意盒子类型,就像所有其他参考类型一样,它们可能是OutOfMemoryError
    • 特别注意整数除法/余数运算的右侧
    • 算术溢出/下溢不会导致抛出异常
    • 精度损失不会导致抛出异常
    • 数学上不定的浮点运算不会导致抛出异常

    除以零

    对于整数操作:

    • 如果右侧为零,则除法和余数操作会抛出null

    对于浮点操作:

    • 如果左操作数为ArithmeticExceptionNaN,则结果为0
    • 如果操作是 division ,则溢出并且结果是带符号的无穷大
    • 如果操作是余数,则结果为NaN

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

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

    附录

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

    相关问题

答案 1 :(得分:11)

因为浮动实际上 表示你想要计算的“数字”。所以它使用它。整数没有这样的表示。

Java(主要)遵循IEEE754的浮点支持,有关详细信息,请参阅here

答案 2 :(得分:2)

这是因为整数运算总是包装它的结果,除了(除法/余数为零)的情况。
在浮动的情况下,当存在溢出或下溢时,包裹变为0,无穷大或NaN 在溢流期间,它给出无穷大,在下溢期间,它给出了0.
再次有积极的&amp;负溢出/下溢。
尝试:

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

这会产生负溢出

输出

  

B = -Infinity

同样,正下溢将导致0和负下溢-0 某些操作也可能导致通过float / double返回NaN(非数字) 例如:

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


输出
  

B = NaN的

答案 3 :(得分:1)

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

检查:

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

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