这是有关如何使用异常的简单示例:
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
因为异常不能是参数化的,所以语法受到限制,因此必须将类型写为标识符,并且不带任何后续参数。