我遇到过以下两个代码。为什么它不抛出浮点异常,而在其他情况下它将抛出运行时异常。
class FloatingPoint
{
public static void main(String [] args)
{
float a=1000f;
float b=a/0;
System.out.println("b=" +b);
}
}
输出:b=无穷大.
如果我尝试使用 int 值,那么它将引发运行时异常。
为什么会这样呢?
简短的回答
积分型 (金龙4.2.1 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.1)与浮点类型(金龙4.2.3 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3)。行为和操作可能有相似之处,但也存在特征上的区别,因此混淆两者可能会导致许多陷阱。
除以零时的行为差异只是这些差异之一。因此,简短的回答是 Java 会这样做,因为该语言是这样说的。
关于整数和浮点值
整数类型的值是以下范围内的整数:
-
byte
: from -128
to 127
, inclusive, i.e. [-2
7
, 2
7
-1]
-
short
: from -32768
to 32767
, inclusive, i.e. [-2
15
, 2
15
-1]
-
int
: from -2147483648
to 2147483647
, inclusive, i.e. [-2
31
, 2
31
-1]
-
long
: from -9223372036854775808
to 9223372036854775807
, inclusive, i.e. [-2
63
, 2
63
-1]
-
char
, from '\u0000'
to '\uffff'
inclusive, that is, from 0
to 65535
, i.e. [0, 2
16
-1]
浮点类型是float
and double
,它们在概念上与单精度 32 位和双精度 64 位格式相关联IEEE 754 http://en.wikipedia.org/wiki/IEEE_754-1985价值观和运作。
它们的值按如下顺序从小到大排列:
- 负无穷大,
- 负有限非零值,
- 正零和负零(即
0.0 == -0.0
),
- 正有限非零值,以及
- 正无穷大。
此外,还有特殊的非数字 (NaN
)值,它们是无序的。这意味着如果其中一个(或两个!)操作数是NaN
:
- 数值比较运算符
<
, <=
, >
, and >=
return false
- 数值相等运算符
==
回报false
- 数值不等式运算符
!=
回报true
尤其,x != x
is true
当且仅当x
is NaN
.
例如double
、无穷大和NaN
可以称为:
- Double.POSITIVE_INFINITY http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#POSITIVE_INFINITY
- Double.NEGATIVE_INFINITY http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#NEGATIVE_INFINITY
-
Double.NaN http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#NaN,可使用辅助方法进行测试boolean isNaN(double) http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#isNaN%28double%29
情况类似于float
and Float http://java.sun.com/javase/6/docs/api/java/lang/Float.html.
关于何时可能抛出异常
数值运算可能只会抛出一个Exception
在这些情况下:
-
NullPointerException
,如果拆箱转换 anull
需要参考
-
ArithmeticException
,如果右侧为零integer除法/余数运算
-
OutOfMemoryError
、如果需要装箱转换且内存不足
它们按重要性排序,考虑到它们是陷阱的常见来源。一般来说:
- 对于框类型要特别小心,就像所有其他引用类型一样,它们可能是
null
- 特别注意整数除法/求余运算的右侧
- 算术上溢/下溢DOES NOT导致抛出异常
- 精度损失DOES NOT导致抛出异常
- 数学上的不定浮点运算DOES NOT导致抛出异常
除以零
For integer手术:
- 除法和余数运算抛出
ArithmeticException
如果右侧为零
For 浮点手术:
- 如果左操作数是
NaN
or 0
,结果是NaN
.
- 如果操作是division,它溢出并且结果是有符号无穷大
- 如果操作是余,结果是
NaN
所有浮点运算的一般规则如下:
- 溢出的运算会产生带符号的无穷大。
- 下溢运算会产生非规范化值或有符号零。
- 没有数学确定结果的运算会产生
NaN
.
- 所有数字运算
NaN
作为操作数产生NaN
因此。
Appendix
这个已经很长的答案仍然没有涵盖许多问题,但鼓励读者浏览相关问题和参考资料。
相关问题
- 这三个特殊浮点值是什么意思:正无穷大、负无穷大、NaN? https://stackoverflow.com/questions/1007586/what-do-these-three-special-floating-point-values-mean-positive-infinity-negati
- Java中NaN是什么意思。 https://stackoverflow.com/questions/2618059/in-java-what-does-nan-mean
- Java什么时候可以产生NaN(有具体代码问题) https://stackoverflow.com/questions/2887131/when-can-java-produce-a-nan-with-specific-code-question
-
为什么在 Java 中 (360 / 24) / 60 = 0 … https://stackoverflow.com/questions/2475652/why-does-360-24-60-0-in-java/(区分整数和浮点运算!)
-
为什么 Java 中 null == 0 会抛出 NullPointerException? https://stackoverflow.com/questions/3352791/why-null-0-throws-nullpointerexception-in-java/(小心盒装原语的危险!)
-
1/0 是合法的 Java 表达式吗? https://stackoverflow.com/questions/2934063/is-1-0-a-legal-java-expression(绝对地!!!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)