$ java ExactArithmeticDemo === addExact / subtractExact / multiplyExact: normal case === Math.addExact(20, 22) = 42 Math.subtractExact(50, 8) = 42 Math.multiplyExact(6, 7) = 42 === addExact / multiplyExact: overflow case - throws instead of wrapping === Math.addExact(Integer.MAX_VALUE, 1) threw: integer overflow Math.multiplyExact(100000, 100000) threw: integer overflow === incrementExact / decrementExact / negateExact === Math.incrementExact(41) = 42 Math.decrementExact(43) = 42 Math.negateExact(-42) = 42 Math.incrementExact(Integer.MAX_VALUE) threw: integer overflow === toIntExact: the safe narrowing cast from long back to int === Math.toIntExact(2000000000L) = 2000000000 Math.toIntExact(3000000000L) threw: integer overflow === The classic trap: Math.abs(Integer.MIN_VALUE) does NOT throw, and is wrong === Math.abs(Integer.MIN_VALUE) = -2147483648 (still negative! +2147483648 doesn't fit in an int) Math.absExact(Integer.MIN_VALUE) threw: Overflow to represent absolute value of Integer.MIN_VALUE