뒤이은 계산에서 이 결과를 사용하기보다는 오버플로 연산이 일어나자마자 바로 알리는 편이 낫다. JDK 8은 Math.multiplyExact() 메서드를 지원한다. 이 메서드는 두 정수를 곱한다. 결과에 오버플로가 생기면 int에서 ArithmeticException을 던진다.
int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
int z = Math.multiplyExact(x, y); // ArithmeticException을 던진다
Info ≣ JDK 8의 Math.multiplyExact(int x, int y)는 int를 반환하고 Math.multiplyExact(long x, long y)는 long을 반환한다. JDK 9에는 long을 반환하는 Math.multiplyExact(long x, int y)도 들어갔다.
JDK 9는 long 값을 반환하는 Math.multiplyFull(int x, int y)를 지원한다. 이 메서드는 수학적으로 정확한 두 정수의 곱을 long으로 구하고 싶을 때 아주 유용하다.
int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
long z = Math.multiplyFull(x, y); // 4611686014132420609
참고로 JDK 9는 long 값을 반환하는 Math.multiplyHigh(long x, long y)도 지원한다. 이 메서드가 반환하는 long 값은 두 64비트 인자의 128비트 곱 중 최상위 64비트를 나타낸다.
long x = Long.MAX_VALUE;
long y = Long.MAX_VALUE;
// 9223372036854775807 * 9223372036854775807 = 4611686018427387903
long z = Math.multiplyHigh(x, y);