Ось простий приклад використання винятку:
class IntegerExceptionTest {
public static void main(String[] args) {
try {
throw new IntegerException(42);
} catch (IntegerException e) {
assert e.getValue() == 42;
}
}
}
Тіло оператора TRy викидає виняток із заданим значенням, яке вловлює застереження.
Навпаки, таке визначення нового винятку заборонено, оскільки воно створює параметризований тип:
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;
}
}
}
Це не дозволено, оскільки тип у пункті вилову не підлягає повторенню. Під час написання цього запису компілятор Sun повідомляє про каскад синтаксичних помилок у такому випадку:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
Оскільки винятки не можуть бути параметричними, синтаксис обмежений таким чином, що тип повинен бути записаний як ідентифікатор, без наступного параметра.