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 della dichiarazione try genera l'eccezione con un dato valore, che viene catturato da la clausola di cattura.
Al contrario, è vietata la seguente definizione di una nuova eccezione, perché crea un tipo parametrico:
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 i rapporti di cui sopra 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 ogni tentativo di catturare una tale eccezione deve fallire, perché il tipo non è reifiable. Ci si potrebbe aspettare un utilizzo tipico della deroga di essere qualcosa di simile a quanto segue:
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;
}
}
}
Questo non è consentito, perché il tipo nella clausola catch non è reifiable. Al momento in cui scriviamo, il compilatore Sun riporta una cascata di errori di sintassi in un caso del genere:
% 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 parametrici, la sintassi è limitato in modo che il tipo deve essere scritto come un identificatore, senza parametro seguente
argomenti di tipo generico sono sostituiti dal limite superiore, che di default è oggetto. Se hai qualcosa come l'Elenco extends A>, allora A viene usato nei file di classe. –
Grazie @Torsten. Non ho pensato a quel caso prima. –
È una buona domanda per l'intervista, questa. – skaffman