นี่คือตัวอย่างง่ายๆของการใช้ข้อยกเว้น:
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;
}
}
}
สิ่งนี้ไม่ได้รับอนุญาตเพราะประเภทในข้อจับไม่สามารถนำมาใช้ใหม่ได้ ในขณะที่เขียนนี้คอมไพเลอร์ Sun รายงานข้อผิดพลาดทางไวยากรณ์ทั้งหมดในกรณีเช่นนี้:
% javac ParametricExceptionTest.java
ParametricExceptionTest.java:5: <identifier> expected
} catch (ParametricException<Integer> e) {
^
ParametricExceptionTest.java:8: ')' expected
}
^
ParametricExceptionTest.java:9: '}' expected
}
^
3 errors
เนื่องจากข้อยกเว้นไม่สามารถเป็นพารามิเตอร์ได้จึงถูก จำกัด ไวยากรณ์เพื่อให้ชนิดนั้นต้องถูกเขียนเป็นตัวระบุโดยไม่มีพารามิเตอร์ต่อไปนี้