短い答え
整数型 ( JLS 4.2.1 ) は、浮動小数点型 ( JLS 4.2.3 ) とは明確に異なります。動作や操作には類似点があるかもしれませんが、両者を混同すると多くの落とし穴につながるような特徴的な違いもあります。
ゼロ除算時の動作の違いは、これらの違いの 1 つにすぎません。したがって、短い答えは、言語がそう言っているので、Java はこのように動作するということです。
整数値と浮動小数点値について
整数型の値は、次の範囲の整数です。
byte: から-128まで127、包括的、つまり[-27, 27-1]
short: から-32768まで32767、包括的、つまり[-215, 215-1]
int: から-2147483648まで2147483647、包括的、つまり[-231, 231-1]
long: から-9223372036854775808まで9223372036854775807、包括的、つまり[-263, 263-1]
char、 から'\u0000'まで、つまり'\uffff'から0まで65535、つまり[0, 216-1]
浮動小数点型はfloatとdoubleであり、概念的には単精度 32 ビットおよび倍精度 64 ビット形式のIEEE 754値および演算に関連付けられています。
それらの値は、最小から最大の順に次のように並べられます。
- 負の無限大、
- 負の有限の非ゼロ値、
- 正および負のゼロ (つまり
0.0 == -0.0)、
- ゼロでない正の有限値、および
- 正の無限大。
さらに、順序付けされていない特殊なNot-a-Number ( NaN) 値があります。これは、どちらか (または両方!) のオペランドが次の場合を意味します。NaN
- 数値比較演算子
<、<=、>、および>=returnfalse
- 数値等価演算子
==が返す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、結果として生成されます。
付録
このすでに長い回答でカバーされていない問題がまだたくさんありますが、読者は関連する質問や参考資料を参照することをお勧めします。
関連する質問