Hier ist ein einfaches Beispiel für die Verwendung der Ausnahme:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
Der Hauptteil der TRy-Anweisung löst die Ausnahme mit einem bestimmten Wert aus, der von der catch-Klausel abgefangen wird.
Im Gegensatz dazu ist die folgende Definition einer neuen Ausnahme verboten, da dadurch ein parametrisierter Typ erstellt wird:
class ParametricException<T> extends Exception { // compile-time error
private final T value;
public ParametricException(T value) { this.value = value; }
public T getValue() { return value; }
}
Ein Versuch, die oben genannten zu kompilieren, meldet einen Fehler:
% 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
Diese Einschränkung ist sinnvoll, da fast jeder Versuch, eine solche Ausnahme abzufangen, fehlschlagen muss, da der Typ nicht überprüfbar ist. Man könnte erwarten, dass eine typische Verwendung der Ausnahme etwa die folgende ist:
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;
}
}
}
Dies ist nicht zulässig, da der Typ in der catch-Klausel nicht überprüfbar ist. Zum Zeitpunkt dieses Schreibens meldet der Sun-Compiler in einem solchen Fall eine Kaskade von Syntaxfehlern:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Da Ausnahmen nicht parametrisch sein können, ist die Syntax eingeschränkt, sodass der Typ als Bezeichner ohne folgenden Parameter geschrieben werden muss.