Voici un exemple simple d'utilisation de l'exception:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
Le corps de l'instruction TRy lève l'exception avec une valeur donnée, qui est interceptée par la clause catch.
En revanche, la définition suivante d'une nouvelle exception est interdite, car elle crée un type paramétré:
class ParametricException<T> extends Exception { // compile-time error
private final T value;
public ParametricException(T value) { this.value = value; }
public T getValue() { return value; }
}
Une tentative de compilation de ce qui précède signale une erreur:
% 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
Cette restriction est judicieuse car presque toute tentative pour intercepter une telle exception doit échouer, car le type n'est pas réifiable. On peut s'attendre à ce qu'une utilisation typique de l'exception ressemble à ce qui suit:
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;
}
}
}
Cela n'est pas autorisé, car le type dans la clause catch n'est pas réifiable. Au moment d'écrire ces lignes, le compilateur Sun signale une cascade d'erreurs de syntaxe dans un tel cas:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Étant donné que les exceptions ne peuvent pas être paramétriques, la syntaxe est restreinte de sorte que le type doit être écrit en tant qu'identificateur, sans paramètre suivant.