Hier ist ein einfaches Beispiel dafür, wie die Ausnahme zu verwenden.
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
der Körper der try-Anweisung wirft die Ausnahme mit einem bestimmten Wert, der durch gefangen die Fangklausel.
Im Gegensatz dazu ist die folgende Definition einer neuen Ausnahme verboten, weil es eine parametrisierte Art erstellt:
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 Berichte einen Fehler zu kompilieren:
% 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, weil fast jeder Versuch, eine solche Ausnahme zu fangen, fehlschlagen muss, weil der Typ nicht verifizierbar ist. Man könnte eine typische Anwendung der Ausnahme erwartet in etwa wie folgt zu sein:
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, weil der Typ in der catch-Klausel nicht reifiable. Zum Zeitpunkt des Schreibens dieses Artikels, berichtet die Sun-Compiler eine Kaskade von Syntaxfehlern in einem solchen Fall:
% 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 kann, wird die Syntax beschränkt, so dass der Typ muss als Kennung geschrieben werden, ohne folgenden Parameter
generisches Typ Argument durch die obere Schranke ersetzt werden, die standardmäßig Objekt ist. Wenn Sie etwas wie die Liste extends A> haben, wird A in den Klassendateien verwendet. –
Danke @Torsten. Ich habe vorher nicht an diesen Fall gedacht. –
Es ist eine gute Interviewfrage, diese. – skaffman