Đây là một ví dụ đơn giản về cách sử dụng ngoại lệ:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
Phần thân của câu lệnh TRy đưa ra ngoại lệ với một giá trị đã cho, được bắt bởi mệnh đề bắt.
Ngược lại, định nghĩa sau đây về một ngoại lệ mới bị cấm, bởi vì nó tạo ra một loại tham số:
class ParametricException<T> extends Exception { // compile-time error
private final T value;
public ParametricException(T value) { this.value = value; }
public T getValue() { return value; }
}
Một nỗ lực để biên dịch các báo cáo ở trên một lỗi:
% 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
Hạn chế này là hợp lý bởi vì hầu hết mọi nỗ lực để bắt một ngoại lệ như vậy đều phải thất bại, vì loại này không thể áp dụng được. Người ta có thể mong đợi một cách sử dụng ngoại lệ điển hình là một cái gì đó như sau:
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;
}
}
}
Điều này là không được phép, bởi vì loại trong mệnh đề bắt không thể áp dụng lại. Tại thời điểm viết bài này, trình biên dịch Sun báo cáo một loạt các lỗi cú pháp trong trường hợp như vậy:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Vì các ngoại lệ không thể là tham số, cú pháp bị hạn chế sao cho loại phải được viết dưới dạng định danh, không có tham số nào sau đây.