Bỏ qua để đến nội dung

Switch fall-through

Trong switch truyền thống, nếu quên break ở cuối một case, chương trình sẽ “rơi tiếp” (fall-through) xuống (các) case bên dưới, chạy luôn code của chúng, bất kể điều kiện có khớp hay không:

int day = 2;
switch (day) {
case 1:
System.out.println("Thứ Hai");
case 2:
System.out.println("Thứ Ba"); // QUÊN break ở case 1 lẫn case 2!
case 3:
System.out.println("Thứ Tư");
break;
default:
System.out.println("Không xác định");
}
// day = 2, nhưng in ra CẢ "Thứ Ba" VÀ "Thứ Tư"! (rơi từ case 2 xuống case 3)

switch truyền thống không tự dừng sau khi tìm thấy case khớp - nó chỉ nhảy đến case đó rồi chạy tuần tự tất cả các dòng lệnh phía sau, xuyên qua ranh giới case, cho đến khi gặp break hoặc hết switch. Đây là hành vi được thiết kế có chủ đích từ những ngày đầu của C (Java kế thừa cú pháp này), nhưng lại là nguồn lỗi rất phổ biến khi lập trình viên vô tình quên break.

1. Luôn nhớ break ở cuối mỗi case (trừ khi thực sự cố ý muốn fall-through, nên có comment giải thích rõ):

switch (day) {
case 1:
System.out.println("Thứ Hai");
break; // BẮT BUỘC nhớ break!
case 2:
System.out.println("Thứ Ba");
break;
default:
System.out.println("Không xác định");
}

2. Fall-through có chủ đích - vẫn hợp lệ khi muốn nhiều case cùng chạy chung một khối lệnh:

switch (day) {
case 6:
case 7: // KHÔNG có break ở case 6 - CỐ Ý để rơi xuống case 7, dùng chung code
System.out.println("Cuối tuần");
break;
default:
System.out.println("Ngày trong tuần");
}

3. Cách an toàn nhất: dùng switch expression hiện đại (Java 14+) - không có khái niệm fall-through, mỗi nhánh -> hoàn toàn độc lập:

String result = switch (day) {
case 1 -> "Thứ Hai";
case 2 -> "Thứ Ba";
case 6, 7 -> "Cuối tuần"; // gộp nhiều case rõ ràng bằng dấu phẩy, không cần fall-through
default -> "Không xác định";
};

Xem chi tiết cú pháp switch expression ở trang “switch case” trong mục Ngôn ngữ Java.

Switch truyền thống fall-through: thiếu break khiến chương trình chạy tiếp xuyên qua các case bên dưới, không tự dừng lại.

  • Luôn kiểm tra có break ở cuối mỗi case khi dùng switch truyền thống
  • Ưu tiên switch expression (->, Java 14+) trong code mới - loại bỏ hoàn toàn nguy cơ quên break