Краткий ответ
Интегральные типы ( 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
, от '\u0000'
до '\uffff'
включительно, то есть от 0
до 65535
, т.е. [0, 2
16
-1]
Типами с плавающей точкой являются float
и double
, которые концептуально связаны с 32-битным и 64-битным форматами с одинарной точностью IEEE 754 значения и операции.
Их значения упорядочены следующим образом, от наименьшего к наибольшему:
- отрицательная бесконечность,
- отрицательные конечные ненулевые значения,
- положительный и отрицательный ноль (т.е.
0.0 == -0.0
),
- положительные конечные ненулевые значения и
- положительная бесконечность.
Кроме того, существуют специальные Not-a-Number (NaN
) значения, которые являются неупорядоченными . Это означает, что если один (или оба!) Операнд равен NaN
:
- операторы числового сравнения
<
, <=
, >
и >=
return 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
в результате.
Приложение
По-прежнему существует много вопросов, не охваченных этим уже длинным ответом, но читателям рекомендуется просматривать связанные вопросы и ссылочные материалы.
вопросы