Ecco un semplice esempio di come utilizzare l'eccezione:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
Il corpo dell'istruzione TRy genera l'eccezione con un determinato valore, che viene catturato dalla clausola catch.
Al contrario, la seguente definizione di nuova eccezione è vietata, poiché crea un tipo con parametri:
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 tentativo di compilare quanto sopra riporta un errore:
% 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
Questa restrizione è ragionevole perché quasi tutti i tentativi di rilevare tale eccezione devono fallire, poiché il tipo non è riutilizzabile. Ci si potrebbe aspettare che un uso tipico dell'eccezione sia simile al seguente:
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;
}
}
}
Ciò non è consentito, poiché il tipo nella clausola catch non è riutilizzabile. Al momento della stesura di questo documento, il compilatore Sun riporta una cascata di errori di sintassi in tal caso:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Poiché le eccezioni non possono essere parametriche, la sintassi è limitata in modo che il tipo debba essere scritto come identificatore, senza il seguente parametro.