Voici un exemple simple de l'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 d'une valeur donnée, qui est pris par la clause de capture.
En revanche, la définition suivante d'une nouvelle exception est interdite, car elle crée un type paramétrées:
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 compiler les rapports ci-dessus 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 raisonnable parce que presque toute tentative d'attraper une telle exception doit échouer, parce que le type n'est pas reifiable. On pourrait attendre une utilisation typique de l'exception à être quelque chose comme 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;
}
}
}
Ce n'est pas autorisé, car le type dans la clause de capture ne sont pas réifiable. Au moment où nous écrivons 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
Parce que les exceptions ne peuvent pas être paramétrique, la syntaxe est limitée afin que le type doit être écrit sous la forme d'un identifiant, sans paramètre suivant.
arguments de type générique sont remplacés par la limite supérieure, qui par défaut est l'objet. Si vous avez quelque chose comme la liste extends A>, alors A est utilisé dans les fichiers de classe. –
Merci @Torsten. Je n'ai pas pensé à ce cas auparavant. –
C'est une bonne question d'interview, celle-ci. – skaffman