Java also guarantees that every operand of an operator (except the conditional
operators &&
, ||
, and ?
:
) appears to be fully evaluated before any part of the
operation itself is performed.
If the binary operator is an integer division /
(§15.16.2) or integer remainder %
(§15.16.3), then its execution may raise an ArithmeticException
, but this exception is thrown only after both operands of the binary operator have been evaluated and only if these evaluations completed normally.
class Test { public static void main(String[] args) { int divisor = 0; try { int i = 1 / (divisor * loseBig()); } catch (Exception e) { System.out.println(e); } }
static int loseBig() throws Exception { throw new Exception("Shuffle off to Buffalo!"); }
}
java.lang.Exception: Shuffle off to Buffalo!
java.lang.ArithmeticException: / by zero
since no part of the division operation, including signaling of a divide-by-zero
exception, may appear to occur before the invocation of loseBig
completes, even
though the implementation may be able to detect or infer that the division operation would certainly result in a divide-by-zero exception.