Checked exception: extends Exception (không phải RuntimeException), compiler bắt buộc phải xử lý bằng try-catch hoặc khai báo throws.
Ví dụ: IOException, SQLException. Unchecked exception: extends RuntimeException, không bắt buộc xử lý.
Ví dụ: NullPointerException, ArrayIndexOutOfBoundsException. Checked dùng cho lỗi có thể phục hồi; unchecked cho lỗi lập trình. Xu hướng hiện đại (Spring, Java mới) ưu tiên unchecked để tránh code rườm rà.