![](/img/trans.png)
[英]Why does this use of Generics not throw a runtime or compile time exception?
[英]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
:从-128
到127
,包括在内,即[-2
7
, 2
7
-1]
short
:从-32768
到32767
,包括在内,即[-2
15
, 2
15
-1]
int
: 从-2147483648
到2147483647
,包括在内,即[-2
31
, 2
31
-1]
long
:从-9223372036854775808
到9223372036854775807
,包括在内,即[-2
63
, 2
63
-1]
char
,从'\ '
到'\'
包含,即从0
到65535
,即[0, 2
16
-1]
浮点类型是float
和double
,它们在概念上与单精度 32 位和双精度 64 位格式IEEE 754值和操作相关联。
它们的值按从最小到最大的顺序排列如下:
0.0 == -0.0
), 此外,还有特殊的Not-a-Number ( NaN
) 值,它们是无序的。 这意味着如果其中一个(或两个!)操作数是NaN
:
<
、 <=
、 >
和>=
返回false
==
返回false
!=
返回true
特别是, x != x
为true
当且仅当x
是NaN
。
例如double
,无穷大和NaN
可以被称为:
这种情况类似于float
和Float
。
在这些情况下,数值运算可能只抛出Exception
:
NullPointerException
,如果需要对null
引用进行拆箱转换ArithmeticException
,如果整数除法/余数运算的右侧为零OutOfMemoryError
,如果需要装箱转换且内存不足它们按重要性排序,因为它们是陷阱的常见来源。 通常来说,一般来说:
null
对于整数运算:
ArithmeticException
对于浮点运算:
NaN
或0
,则结果为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 中无法表示相同。
查看 :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.