例外の使用方法の簡単な例を次に示します。
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
TRyステートメントの本文は、指定された値で例外をスローし、catch句によってキャッチされます。
対照的に、パラメーター化された型を作成するため、次の新しい例外の定義は禁止されています。
class ParametricException<T> extends Exception { // compile-time error
private final T value;
public ParametricException(T value) { this.value = value; }
public T getValue() { return value; }
}
上記をコンパイルしようとすると、エラーが報告されます。
% 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
この制限は賢明です。なぜなら、そのような例外をキャッチしようとするほとんどすべての試みは失敗しなければならないからです。これは、型が再変換可能ではないためです。例外の一般的な用途は次のようなものであると期待できます。
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;
}
}
}
これは許可されていません。catch節のタイプは再設定できないためです。この記事の執筆時点では、Sunコンパイラはそのような場合に一連の構文エラーを報告しています。
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
例外はパラメトリックにすることはできないため、構文は制限されているため、型は識別子として記述する必要があり、後続のパラメーターはありません。