$ 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
