Java: Khối catch
Ta kết hợp các trình xử lý sự kiện với khối try
bằng cách gọi một hoặc nhiều khối catch trực tiếp sau khối try
. Ở giữa khối try và khối catch không được có đoạn mã nào xen kẽ.
try {
} catch (ExceptionType name) {
} catch (ExceptionType name) {
}
Mỗi khối catch
là một trình xử lý ngoại lệ để xử lý loại ngoại lệ được chỉ ra bởi đối số của nó. Kiểu đối số được khai báo tại phần ExceptionType
để trình xử lý có thể xử lý và phải là tên của lớp thừa kế từ lớp Throwable
. Trình xử lý có thể tham chiếu tới ngoại lệ thông qua name
, là tên của ngoại lệ muốn bắt.
Khối catch
có chứa mã lệnh được thực thi nếu và khi trình xử lý ngoại lệ được gọi. Hệ thống runtime sẽ gọi trình xử lý ngoại lệ khi trình xử lý là thành phần đầu tiên trong call stack phù hợp với ExceptionType
là kiểu ngoại lệ được ném ra từ try. Hệ thống sẽ coi nó là tương thích nếu như đối tượng được ném ra có thể được gán cho tham số của trình xử lý ngoại lệ.
Sau đây là hai trình xử lý ngoại lệ dành cho phương thức writeList
:
try {
} catch (IndexOutOfBoundsException e) {
System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Đã bắt ngoại lệ IOException: " + e.getMessage());
}
Các trình xử lý ngoại lệ có thể làm nhiều hơn việc việc in thông báo lỗi hay dừng chương trình. Chúng có thể làm phục hồi lỗi, nhắc nhở người dùng thực hiện một quyết định, hoặc chuyển lỗi lên trình xử lý mức cao hơn bằng cách sử dụng ngoại lệ kết chuỗi.
Bắt nhiều hơn một loại ngoại lệ bằng một trình xử lý ngoại lệ
Từ phiên bản Java SE 7 trở đi thì một khối catch
có thể xử lý nhiều hơn một loại ngoại lệ. Đặc tính này có thể giảm bớt sự trùng lặp mã lệnh và giảm bớt sự cám dỗ để bắt một ngoại lệ quá rộng.
Theo đó thì trong mệnh đề catch
ta sẽ xác định kiểu của những loại ngoại lệ mà khối có thể xử lý và tách riêng từng loại ngoại lệ bằng cách dùng dấu xổ đứng (|):
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
Lưu ý: Nếu khối catch
xử lý nhiều hơn một loại ngoại lệ thì tham số của nó ngầm định là final
. Trong ví dụ trên thì tham số ex
của khối catch
là final
và như vậy ta không thể gán bất kỳ giá trị nào cho nó trong khối catch
.