1. Giới thiệu
Hãy hình dung: bạn đang viết một chương trình cho quán cà phê. Người dùng có thể chọn đồ uống, và bạn cần phản hồi lựa chọn đó. Dĩ nhiên có thể dùng cả đống if-else if-else, nhưng nhìn không đẹp:
if (choice == 1)
{
System.out.println("Bạn đã chọn espresso.");
}
else if (choice == 2)
{
System.out.println("Bạn đã chọn cappuccino.");
}
else if (choice == 3)
{
System.out.println("Bạn đã chọn latte.");
}
else
{
System.out.println("Không có đồ uống như vậy.");
}
Công nhận là cồng kềnh. Nếu có 10 hay 20 lựa chọn thì sao? Khi đó toán tử switch sẽ giúp bạn triển khai lựa chọn theo giá trị của biến một cách gọn gàng và rõ ràng.
Cú pháp switch cổ điển
Cú pháp switch trong Java như sau:
switch (vyrazhenie)
{
case znachenie1:
// hành động khi biểu thức == giá trị 1
break;
case znachenie2:
// hành động khi biểu thức == giá trị 2
break;
...
default:
// hành động khi không khớp với case nào
break;
}
switch trong Java
Các thành phần chính:
- switch (biểu thức) — biểu thức mà kết quả của nó sẽ được so sánh với từng case.
- case giá trị: — phương án để so sánh với biểu thức.
- break; — kết thúc việc thực thi khối switch (nếu không — sẽ “rơi xuyên” sang case tiếp theo).
- default: — chạy khi không khớp với bất kỳ case nào.
2. Ví dụ sử dụng switch
Ví dụ 1: Kinh điển — chọn đồ uống
Hãy triển khai menu cho quán cà phê:
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Hãy chọn đồ uống:");
System.out.println("1 - Espresso");
System.out.println("2 - Cappuccino");
System.out.println("3 - Latte");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("Bạn đã chọn espresso.");
break;
case 2:
System.out.println("Bạn đã chọn cappuccino.");
break;
case 3:
System.out.println("Bạn đã chọn latte.");
break;
default:
System.out.println("Không có đồ uống như vậy.");
break;
}
}
}
Điều gì diễn ra:
- Người dùng nhập số của đồ uống.
- Giá trị biến choice được so sánh với từng case.
- Nếu trùng khớp — khối tương ứng được thực thi, sau đó break kết thúc switch.
- Nếu không trùng khớp với bất kỳ cái nào — chạy default.
Ví dụ 2: Chuyển theo chuỗi
Không có nhiều kiểu có thể dùng trong switch, nhưng chuỗi — dùng được! Điều này rất tiện cho menu lệnh:
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Nhập lệnh (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("Khởi chạy chương trình!");
break;
case "stop":
System.out.println("Dừng chương trình.");
break;
case "pause":
System.out.println("Tạm dừng.");
break;
default:
System.out.println("Lệnh không xác định.");
break;
}
}
}
Lưu ý: so sánh chuỗi trong switch — phân biệt chữ hoa/thường! "Start" và "start" — là hai chuỗi khác nhau.
3. Những kiểu nào được switch cổ điển hỗ trợ?
Với switch cổ điển chỉ có thể dùng một số kiểu nhất định:
- Kiểu nguyên thủy số nguyên: byte, short, char, int
- Enum: enum (sẽ bàn ở bài giảng tiếp theo)
- Chuỗi: String — so sánh có phân biệt hoa/thường
Không thể dùng: boolean, float, double, mảng, các đối tượng lớp tùy ý (trừ enum và String).
Ví dụ với char
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("Xuất sắc!");
break;
case 'B':
System.out.println("Tốt.");
break;
case 'C':
System.out.println("Đạt.");
break;
default:
System.out.println("Hãy thử lại.");
break;
}
4. Tính bắt buộc của break: điều gì xảy ra nếu quên?
Lỗi phổ biến nhất của người mới — quên break;. Hãy xem điều gì xảy ra:
int day = 2;
switch (day)
{
case 1:
System.out.println("Thứ Hai");
break;
case 2:
System.out.println("Thứ Ba");
case 3:
System.out.println("Thứ Tư");
break;
default:
System.out.println("Ngày không xác định");
break;
}
Kết quả:
Thứ Ba
Thứ Tư
Tại sao? Vì sau case 2 không có break, nên việc thực thi “rơi xuyên” sang case tiếp theo (điều này gọi là fall-through). Đôi khi hữu ích, nhưng thường là lỗi.
5. Nhóm case: khi nhiều lựa chọn có cùng hành vi
Nếu nhiều giá trị cần cùng một hành vi, có thể liệt kê chúng liên tiếp:
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("Mùa đông");
break;
case 3:
case 4:
case 5:
System.out.println("Mùa xuân");
break;
case 6:
case 7:
case 8:
System.out.println("Mùa hè");
break;
case 9:
case 10:
case 11:
System.out.println("Mùa thu");
break;
default:
System.out.println("Tháng không xác định");
break;
}
Ở đây: nếu month — 12, 1 hoặc 2, chương trình sẽ in "Mùa đông".
6. So sánh: switch và if-else
| Kịch bản | if-else | switch |
|---|---|---|
| Nhiều lựa chọn | Chuỗi dài, khó đọc hơn | Ngắn gọn, mọi lựa chọn thấy ngay |
| So sánh theo khoảng | Có thể dùng (if (x > 5 && x < 10)) | Không thể, chỉ giá trị cụ thể |
| Kiểu được hỗ trợ | Bất kỳ | Chỉ một số kiểu nhất định (xem ở trên) |
| Bẫy với break | Không | Có, bắt buộc phải chú ý break |
7. Những lỗi thường gặp khi làm việc với switch
Lỗi số 1: quên break
Nguyên nhân gây bug phổ biến nhất: quên break — và mã chạy sang case không như mong đợi.
Lỗi số 2: kiểu không được hỗ trợ
Cố dùng double, float hoặc boolean — trình biên dịch sẽ báo “không được”.
Lỗi số 3: chuỗi khác nhau về chữ hoa/thường
Người dùng nhập "Start", còn bạn chờ "start" — switch sẽ không khớp. Tốt nhất hãy đưa chuỗi về cùng một kiểu chữ hoa/thường trước:
switch (command.toLowerCase())
{
case "start":
// ...
}
Lỗi số 4: dùng biến trong case thay vì hằng số
Chỉ cho phép hằng số trong case. Dùng biến sẽ gây lỗi biên dịch.
Lỗi số 5: trùng lặp case
Hai giá trị case giống nhau — trình biên dịch sẽ không chấp nhận.
GO TO FULL VERSION