1. Cú pháp cơ bản của if lồng nhau
Trong đời thực hiếm khi quyết định chỉ dựa trên một tiêu chí. Thông thường phải kiểm tra nhiều điều kiện cùng lúc, và chúng thường phụ thuộc lẫn nhau. Ví dụ, để vào buổi hòa nhạc, không chỉ cần là người trưởng thành — đôi khi còn cần có tên trong danh sách khách mời. Đây chính là lúc logic nhiều cấp xuất hiện, và chúng ta dùng các toán tử if lồng nhau để xử lý.
Điều kiện lồng nhau là khi một if “sống” bên trong một if khác. Hãy tưởng tượng hộp trong hộp: nếu điều kiện bên ngoài đúng, khi đó mới kiểm tra điều kiện bên trong. Đây là công cụ mạnh để kiểm soát luồng thực thi.
Bắt đầu với ví dụ đơn giản:
if (uslovieA)
{
// hành động nếu uslovieA — true (đúng)
if (uslovieB)
{
// hành động nếu cả hai điều kiện đều đúng
}
}
if lồng bên trong một
if khác
Nếu điều này gợi bạn nhớ đến búp bê Matryoshka — bạn hiểu đúng rồi! if bên trong chỉ chạy khi if bên ngoài đã thỏa điều kiện.
Ví dụ: vào câu lạc bộ
Hãy phát triển tiếp ứng dụng học tập của chúng ta, nơi người dùng đã nhập tên và tuổi. Giờ thêm tầng kiểm tra thứ hai: giả sử để vào câu lạc bộ kín, cần trên 21 tuổi và có mã mời.
System.out.print("Nhập tên của bạn: ");
String name = console.nextLine();
System.out.print("Nhập tuổi của bạn: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("Nhập mã mời: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Chào mừng, " + name + ", đến câu lạc bộ VIP!");
}
else
{
System.out.println("Xin lỗi, mã không đúng. Truy cập bị từ chối.");
}
}
else
{
System.out.println("Xin lỗi, chỉ vào từ 21 tuổi trở lên!");
}
Lưu ý: if bên trong chỉ kiểm tra mã khi tuổi đã đạt yêu cầu. Điều này tiết kiệm tài nguyên (và cả thần kinh của bảo vệ).
2. Có thể lồng bao nhiêu cấp?
Về mặt kỹ thuật — bao nhiêu cũng được. Nhưng trên thực tế: càng nhiều tầng lồng nhau, code càng khó đọc và bảo trì. Thông thường người ta cố giới hạn ở 2–3 cấp. Nếu xuất hiện “cầu thang” với 4+ if lồng nhau, hãy nghĩ xem có thể đơn giản hóa logic hoặc tách kiểm tra ra thành các phương thức hay không.
3. if và else lồng nhau: bẫy và lưu ý
Lỗi người mới: dùng ngoặc nhọn một cách cẩu thả.
Trong Java, khi dùng else có một quy tắc chặt chẽ: nếu không có ngoặc nhọn {}, if hoặc else chỉ áp dụng cho câu lệnh đầu tiên ngay sau nó. Đây là nguồn gốc thường gặp của các bug khó chịu.
Ví dụ có khả năng sai:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("Chào mừng!");
else
System.out.println("Mã không đúng.");
Nhiều người kỳ vọng else áp dụng cho việc kiểm tra tuổi, nhưng thực tế nó gắn với if gần nhất trước nó (kiểm tra mã mời). Vì vậy thông báo có thể hiển thị không như mong đợi. Tốt nhất luôn dùng ngoặc nhọn — ngay cả khi bên trong chỉ có một dòng!
Để tránh hiểu lầm, trình biên dịch “nhìn” đoạn mã như sau:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("Chào mừng!");
else
System.out.println("Mã không đúng.");
}
Quan trọng! Nhắc lại: nếu trong cấu trúc if-else không đặt ngoặc nhọn, else sẽ gắn với if đứng ngay trước nó (gần nhất).
4. Các lựa chọn: else if trong điều kiện lồng nhau
Đôi khi bên trong if bên ngoài, bạn không chỉ muốn kiểm tra một điều kiện bổ sung mà còn muốn dự liệu các phương án thay thế. Ví dụ, nếu mã mời không đúng, có thể đề nghị chế độ khách hoặc từ chối.
if (age >= 21)
{
System.out.print("Nhập mã mời: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Chào mừng đến câu lạc bộ!");
}
else if (code.equals("GUEST"))
{
System.out.println("Chế độ khách: chỉ được phép đến 23:00.");
}
else
{
System.out.println("Tiếc là không thể truy cập.");
}
}
else
{
System.out.println("Chỉ vào từ 21 tuổi.");
}
Ở đây, bên trong nhánh ngoài, chúng ta lựa chọn giữa ba kịch bản: mã VIP, mã khách và từ chối.
5. Thực hành: máy tính giảm giá với logic nhiều cấp
Giả sử người dùng được áp dụng giảm giá dựa trên tuổi và việc có thẻ câu lạc bộ.
- Nếu tuổi người dùng lớn hơn hoặc bằng 60 — giảm 15%.
- Nếu tuổi nhỏ hơn, nhưng người dùng có thẻ câu lạc bộ — giảm 7%.
- Các trường hợp còn lại thì không có giảm giá.
Làm thế nào để viết điều này?
System.out.print("Nhập tuổi của bạn: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("Bạn có thẻ câu lạc bộ không (có/không)? ");
String hasCard = console.nextLine();
if (hasCard.equals("có"))
{
discount = 0.07;
}
}
System.out.println("Giảm giá của bạn: " + (discount * 100) + "%");
Ở đây chúng ta dùng if lồng nhau bên trong nhánh else: nếu tuổi không đạt, khi đó mới hỏi về thẻ.
GO TO FULL VERSION