Aquí hay un ejemplo simple de cómo usar la excepción:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
El cuerpo de la instrucción TRy arroja la excepción con un valor dado, que es captado por la cláusula catch.
Por el contrario, la siguiente definición de una nueva excepción está prohibida, ya que crea un tipo parametrizado:
class ParametricException<T> extends Exception { // compile-time error
private final T value;
public ParametricException(T value) { this.value = value; }
public T getValue() { return value; }
}
Un intento de compilar lo anterior informa un error:
% javac ParametricException.java
ParametricException.java:1: a generic class may not extend
java.lang.Throwable
class ParametricException<T> extends Exception { // compile-time error
^
1 error
Esta restricción es sensata porque casi cualquier intento de detectar dicha excepción debe fallar, porque el tipo no es reificable. Uno podría esperar que un uso típico de la excepción sea algo como lo siguiente:
class ParametricExceptionTest {
public static void main(String[] args) {
try {
throw new ParametricException<Integer>(42);
} catch (ParametricException<Integer> e) { // compile-time error
assert e.getValue()==42;
}
}
}
Esto no está permitido, porque el tipo en la cláusula catch no es reificable. Al momento de escribir este artículo, el compilador de Sun informa una cascada de errores de sintaxis en tal caso:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Como las excepciones no pueden ser paramétricas, la sintaxis está restringida, por lo que el tipo debe escribirse como un identificador, sin el siguiente parámetro.