Tạo bởi Trần Văn Điêp|
Java Advanced

Tìm hiểu Exception trong Java – Xử lý lỗi với ví dụ thực tế (Survey Example)

Trong lập trình Java nâng cao, Exception (ngoại lệ) là một phần quan trọng giúp chương trình hoạt động ổn định và dễ kiểm soát lỗi. Thay vì để chương trình “crash” khi gặp sai sót, Java cho phép bạn phát hiện, ném (throw)bắt (catch) các lỗi này để xử lý hợp lý.

Trong bài học hôm nay, chúng ta sẽ cùng tìm hiểu cách xây dựng Exception tùy chỉnh (Custom Exception) thông qua ví dụ thực tế:

Chương trình kiểm tra thông tin người dùng – Survey Program.

Bạn sẽ học cách:

  • Tạo và sử dụng class Exception riêng cho từng loại lỗi (Fullname, Age, Email).

  • Áp dụng cú pháp throw, try-catch và cơ chế xử lý ngoại lệ có điều kiện.

  • Kiểm thử từng tình huống lỗi và cách hiển thị thông báo phù hợp.


🧩 I. Mục tiêu bài tập

Xây dựng chương trình khảo sát thông tin cá nhân (Survey) với các yêu cầu sau:

1️⃣ Tạo class Survey gồm các thuộc tính:

Thuộc tínhKiểu dữ liệuMô tả
fullnameStringHọ tên người dùng
ageintTuổi
emailStringĐịa chỉ email
addressStringĐịa chỉ
noteStringGhi chú thêm

2️⃣ Hàm tạo có đầy đủ tham số

Khi khởi tạo đối tượng Survey, cần kiểm tra tính hợp lệ dữ liệu:

  • fullname chỉ được chứa chữ cái a–z, A–Z và dấu cách.
    → Nếu sai, ném lỗi (throw) FullnameFormatException.

  • age phải lớn hơn 0.
    → Nếu sai, ném lỗi AgeFormatException.

  • email phải chứa ký tự “@”.
    → Nếu sai, ném lỗi EmailFormatException.

3️⃣ Tạo 3 class Exception tùy chỉnh

  • FullnameFormatException

  • AgeFormatException

  • EmailFormatException

Các class này kế thừa từ Exception và giúp mô tả rõ ràng từng loại lỗi.

4️⃣ Class Main

Tạo 4 đối tượng Survey để test các trường hợp:

  1. Sai định dạng fullname.

  2. Sai tuổi (age ≤ 0).

  3. Sai định dạng email.

  4. Trường hợp hợp lệ (thành công).

⚠️ Lưu ý: Không dùng Scanner, dữ liệu được truyền trực tiếp từ main().


⚙️ II. Source Code chi tiết

🧱 1. Class FullnameFormatException.java

package java2.overview.lesson03; public class FullnameFormatException extends Exception { public FullnameFormatException() { super("Fullname chỉ được chứa ký tự chữ và dấu cách."); } }

🧱 2. Class AgeFormatException.java

package java2.overview.lesson03; public class AgeFormatException extends Exception { public AgeFormatException() { super("Tuổi phải lớn hơn 0."); } }

🧱 3. Class EmailFormatException.java

package java2.overview.lesson03; public class EmailFormatException extends Exception { public EmailFormatException() { super("Email không hợp lệ, cần chứa ký tự @."); } }

🧱 4. Class Survey.java

package java2.overview.lesson03; import java.util.regex.Pattern; import java.util.regex.Matcher; public class Survey { private String fullname; private int age; private String email; private String address; private String note; public Survey(String fullname, int age, String email, String address, String note) throws AgeFormatException, EmailFormatException, FullnameFormatException { // Kiểm tra định dạng fullname Pattern pattern = Pattern.compile("^[a-zA-Z ]+$"); Matcher matcher = pattern.matcher(fullname); if (!matcher.find()) { throw new FullnameFormatException(); } this.fullname = fullname; // Kiểm tra tuổi if (age <= 0) { throw new AgeFormatException(); } this.age = age; // Kiểm tra email if (!email.contains("@")) { throw new EmailFormatException(); } this.email = email; this.address = address; this.note = note; } @Override public String toString() { return "Survey {" + "fullname='" + fullname + '\'' + ", age=" + age + ", email='" + email + '\'' + ", address='" + address + '\'' + ", note='" + note + '\'' + '}'; } }

🧱 5. Class Main.java

package java2.overview.lesson03; public class Main { public static void main(String[] args) { Survey survey; // 1️⃣ Test fullname sai try { survey = new Survey("Tran@Van A", 20, "a@gmail.com", "Ha Noi", "OKOK"); System.out.println(survey); } catch (Exception ex) { System.out.println(ex.getMessage()); } // 2️⃣ Test tuổi sai try { survey = new Survey("Tran Van A", -20, "a@gmail.com", "Ha Noi", "OKOK"); System.out.println(survey); } catch (Exception ex) { System.out.println(ex.getMessage()); } // 3️⃣ Test email sai try { survey = new Survey("Tran Van A", 20, "agmail.com", "Ha Noi", "OKOK"); System.out.println(survey); } catch (Exception ex) { System.out.println(ex.getMessage()); } // 4️⃣ Trường hợp hợp lệ try { survey = new Survey("Tran Van A", 20, "a@gmail.com", "Ha Noi", "OKOK"); System.out.println("✅ Nhập thành công: " + survey); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }

🔍 III. Giải thích chi tiết

  • throw: Dùng để ném một exception khi điều kiện không thỏa mãn.

  • try – catch: Giúp chương trình bắt lỗi và tiếp tục chạy thay vì dừng đột ngột.

  • Custom Exception: Giúp bạn phân biệt rõ loại lỗi nào đang xảy ra, dễ xử lý và gỡ lỗi hơn.

Ví dụ chạy chương trình:

Fullname chỉ được chứa ký tự chữ và dấu cách. Tuổi phải lớn hơn 0. Email không hợp lệ, cần chứa ký tự @. ✅ Nhập thành công: Survey {fullname='Tran Van A', age=20, email='a@gmail.com', address='Ha Noi', note='OKOK'}

💡 IV. Lợi ích khi học Exception Handling

  • Giúp chương trình an toàn & đáng tin cậy hơn: Không bị crash vì lỗi nhỏ.

  • Tách biệt logic xử lý và logic kiểm lỗi → mã sạch hơn, dễ bảo trì.

  • Tạo trải nghiệm người dùng tốt hơn khi có thông báo lỗi rõ ràng.

  • Bắt buộc trong các project thực tế (đặc biệt khi thao tác file, database, API).


🧭 V. Kết luận

Qua bài học này, bạn đã hiểu rõ:

  • Cách tạo Custom Exception trong Java.

  • Cách kiểm tra dữ liệu đầu vàoxử lý lỗi bằng try-catch.

  • Cách áp dụng Exception vào các tình huống thực tế như nhập form, kiểm tra dữ liệu, hoặc xác thực thông tin.

Nếu bạn đang học Java Nâng Cao, thì đây là nền tảng cực kỳ quan trọng giúp bạn làm chủ lập trình hướng đối tượng (OOP) và xử lý lỗi chuyên nghiệp.

👉 Tiếp theo, bạn nên học thêm:

  • Try-with-resources & File I/O

  • Exception chaining

  • Logging Exception trong hệ thống lớn

Phản hồi từ học viên

5

Tổng 0 đánh giá

Đăng nhập để làm bài kiểm tra

Chưa có kết quả nào trước đó