Перелив
Умножение не защищено от переполнений.
Здесь вы видите переполнение целых чисел . Если вы возьмете наибольшее целое число Integer.MAX_VALUE
и добавите 1
, вы получите наименьшее целое число INTEGER.MIN_VALUE
:
int value = Integer.MAX_VALUE;
System.out.println(value); // 2147483647
value++;
System.out.println(value); // -2147483648
То же самое происходит здесь, потому что
65_535 * 65_535 = 4_294_836_225 > 2_147_483_647
Диапазон int
В Java int
- это 32-разрядное значение со знаком. В частности, это не без знака .
| min-value | max-value |
-----------------|----------------|---------------|
signed-32-bit | -2^31 | 2^31 - 1 |
| -2_147_483_648 | 2_147_483_647 |
-----------------|----------------|---------------|
unsigned-32-bit | 2^0 - 1 | 2^32 - 1 |
| 0 | 4_294_967_295 |
Исключение
Умножение не бросает ArithmeticException
. Насколько мне известно, это происходит только в том случае, если вы делите на 0
, так как это не должно быть возможно по определению. Также см. документацию об исключении.
Для защищенного умножения рассмотрите возможность использования Math#multiplyExact
( документация ).