Exception hay ngoại lệ trong Java được chia thành 2 loại: Check Exception và Unchecked Exception. Trong hình vẽ thì Unchecked Exception tương đương với RuntimeException và Error.
📌𝐂𝐡𝐞𝐜𝐤 𝐄𝐱𝐜𝐞𝐩𝐭𝐢𝐨𝐧
Check Exception là ngoại lệ được Java kiểm tra vào lúc biên dịch chương trình. Đây là các Exception thường không phải do logic chương trình tạo ra. Ví dụ như khi chương trình đọc file mà file không tồn tại, kết nối đến cơ sở dữ liệu mà không thể kết nối được. Các Exception thường thấy như là: FileNotFoundException, IOException.
Ví dụ dòng code sau sẽ không biên dịch được nếu chúng ta không xử lý với FileNotFoundException:
𝘍𝘪𝘭𝘦𝘙𝘦𝘢𝘥𝘦𝘳 𝘧𝘪𝘭𝘦 = 𝘯𝘦𝘸 𝘍𝘪𝘭𝘦𝘙𝘦𝘢𝘥𝘦𝘳("𝘧𝘪𝘭𝘦𝘵𝘦𝘴𝘵.𝘵𝘹𝘵");
𝘉𝘶𝘧𝘧𝘦𝘳𝘦𝘥𝘙𝘦𝘢𝘥𝘦𝘳 𝘧𝘪𝘭𝘦𝘐𝘯𝘱𝘶𝘵 = 𝘯𝘦𝘸 𝘉𝘶𝘧𝘧𝘦𝘳𝘦𝘥𝘙𝘦𝘢𝘥𝘦𝘳(𝘧𝘪𝘭𝘦);
Muốn chương trình biên dịch được thì bạn phải xử lý exception này bằng 2 cách:
✅Sử dụng câu lệnh try{} catch{}
try {
// đoạn code đọc file ở trên
} catch(IOException e) {
// xử lý lỗi
}
✅Khai báo throws ngoại lệ ở phương thức chứa câu lệnh trên:
void readFile() throws IOException {
// đoạn code đọc file ở trên
}
📌𝐔𝐧𝐂𝐡𝐞𝐜𝐤𝐞𝐝 𝐄𝐱𝐜𝐞𝐩𝐭𝐢𝐨𝐧
Đây là các ngoại lệ thường xuất hiện do lỗi logic của lập trình mà tại thời điểm biên dịch không thể phát hiện ra. Ví dụ như lỗi: NullPointerException, ArrayIndexOutOfBoundsException.
Đoạn code sau bắn ra lỗi ArrayIndexOutOfBoundsException:
𝘓𝘪𝘴𝘵<𝘐𝘯𝘵𝘦𝘨𝘦𝘳> 𝘭𝘪𝘴𝘵 = 𝘈𝘳𝘳𝘢𝘺𝘴.𝘢𝘴𝘓𝘪𝘴𝘵(1,2,3);
𝘭𝘪𝘴𝘵.𝘨𝘦𝘵(4);
Với các lỗi này bạn chỉ có thể tránh thông qua việc kiểm tra các thông số đầu vào, đầu ra trước khi xử lý logic. Nên dùng Unit Test để đảm bảo chương trình không gặp lỗi logic.
Unchecked Exception thường hay dùng nhất là RuntimeException.
👉Khi nào thì dùng CheckException và UnCheckedException
✅Logic chương trình gần như luôn luôn có CheckException. Tuy nhiên nếu xử lý không khéo thì việc quản lý Exception trong một chương trình Java trở nên cồng kềnh phức tạp do trình biên dịch luôn bắt phải tường minh xử lý với các ngoại lệ Checked Exception.
✅Ví dụ chương trình của bạn gọi 3 phương thức A(), B(),C(). Trong đó A sẽ gọi A1(), A2(), A3(), B sẽ gọi B1(),B2(), B3(); C sẽ gọi C1(), C2(). và các phương thức Ai, Bi,Ci này đều bắn ra các Checked Exception khác nhau. Khi đó chương trình chính của bạn sẽ phải quản lý rất nhiều exception. Dẫn đến code sẽ dài dòng hơn và logic chính bị che mờ do phần xử lý lỗi.
✅Do đó có một trường phái khác là sẽ chuyển đổi các Checked Exception về Unchecked Exception. Giống như cách xử lý ngoại lệ trong ngôn ngữ C++ là chỉ có Unchecked Exception. Điều này sẽ làm chương trình gọn gàng hơn nhiều. Nhưng bạn phải rất cẩn trọng và hiểu được mình đang làm gì nếu theo cách này, và tốt nhất luôn luôn có Unit Test.
إرسال تعليق
Cảm ơn bạn đã quan tâm và bày tỏ :D