15.5 Normal and Abrupt Completion of Evaluation

No more: the end is sudden and abrupt.
--William Wordsworth, Apology for the Foregoing Poems (1831)

Every expression has a normal mode of evaluation in which certain computational steps are carried out. The following sections describe the normal mode of evaluation for each kind of expression. If all the steps are carried out without an exception being thrown, the expression is said to complete normally.

If, however, evaluation of an expression throws an exception, then the expression is said to complete abruptly. An abrupt completion always has an associated reason, which is always a throw with a given value.

Run-time exceptions are thrown by the predefined operators as follows:

  • A class instance creation expression (§15.8), array creation expression (§15.9), or string concatenation operatior expression (§15.17.1) throws an OutOfMemoryError if there is insufficient memory available.
  • An array creation expression throws an ArrayNegativeSizeException if the value of any dimension expression is less than zero (§15.9).
  • A field access (§15.10) throws a NullPointerException if the value of the object reference expression is null.
  • A method invocation expression (§15.11) that invokes an instance method throws a NullPointerException if the target reference is null.
  • An array access (§15.12) throws a NullPointerException if the value of the array reference expression is null.
  • An array access (§15.12) throws an IndexOutOfBoundsException if the value of the array index expression is negative or greater than or equal to the length of the array.
  • A cast (§15.15) throws a ClassCastException if a cast is found to be impermissible at run time.
  • An integer division (§15.16.2) or integer remainder (§15.16.3) operator throws an ArithmeticException if the value of the right-hand operand expression is zero.
  • An assignment to an array component of reference type (§15.25.1) throws an ArrayStoreException when the value to be assigned is not compatible with the component type of the array.

A method invocation expression can also result in an exception being thrown if an exception occurs that causes execution of the method body to complete abruptly. A class instance creation expression can also result in an exception being thrown if an exception occurs that causes execution of the constructor to complete abruptly. Various linkage and virtual machine errors may also occur during the evaluation of an expression. By their nature, such errors are difficult to predict and difficult to handle.

If an exception occurs, then evaluation of one or more expressions may be terminated before all steps of their normal mode of evaluation are complete; such expressions are said to complete abruptly. The terms "complete normally" and "complete abruptly" are also applied to the execution of statements (§14.1). A statement may complete abruptly for a variety of reasons, not just because an exception is thrown.

If evaluation of an expression requires evaluation of a subexpression, abrupt completion of the subexpression always causes the immediate abrupt completion of the expression itself, with the same reason, and all succeeding steps in the normal mode of evaluation are not performed.