Khi chúng ta muốn viết một cấu trúc rẽ nhánh có nhiều lựa chọn, ta có thể sử dụng nhiều lệnh if-else lồng nhau. Tuy nhiên, trong trường hợp việc lựa chọn rẽ nhánh phụ thuộc vào giá trị (kiểu số nguyên hoặc kí tự, hoặc xâu kí tự kể từ JDK 7.0) của một biến hay biểu thức, ta có thể sử dụng cấu trúc switch để chương trình dễ hiểu hơn. Lệnh switch điển hình có dạng như sau:
switch (bieu_thuc){
   
case hang_1:
        tap_lenh;
       
break;
   
case hang_1:
        tap_lenh;
       
break;
    ...
   
default:
        tap_lenh_mac_dinh;
}

Khi lệnh switch được chạy, biểu_thức được tính giá trị và so sánh với hằng_1. Nếu bằng nhau, chuỗi lệnh kể từ tập_lệnh_1 được thực thi cho đến khi gặp lệnh break đầu tiên, đến đây chương trình sẽ nhảy tới điểm kết thúc cấu trúc switch. Nếu biểu_thức không có giá trị bằng hằng_1, nó sẽ được so sánh với hằng_2, nếu bằng nhau, chương trình sẽ thực thi chuỗi lệnh kể từ tập_lệnh_2 tới khi gặp lệnh break đầu tiên thì nhảy tới cuối cấu trúc switch. Quy trình cứ tiếp diễn như vậy. Cuối cùng, nếu biểu_thức có giá trị khác với tất cả các giá trị đã được liệt kê (hằng_1, hằng_2, ...), chương trình sẽ thực thi tập_lệnh_mặc_định nằm sau nhãn default: nếu như có nhãn này (không bắt buộc).
Ví dụ, lệnh sau so sánh giá trị của biến grade với các hằng kí tự 'A', 'B', 'C' và in ra các thông báo khác nhau cho từng trường hợp.
switch (grade){
   
case "A":
        System.
out.println("Grade = A");;
       
break;
   
case "B":
        System.
out.println("Grade = B");;
       
break;
   
case "C":
        System.
out.println("Grade = C");
       
break;
   
default:
        System.
out.println("Grade's not A, B or C"
);;
}

Nó tương đương với khối lệnh if-else lồng nhau sau:
if(grade.equals("A")){
    System.out.println("Grade = A");;
}else if(grade.equals("B")){
    System.out.println("Grade = B");;
}else if(grade.equals("C")){
    System.out.println("Grade = C");
}else {
    System.out.println("Grade's not A, B or C");;
}
Lưu ý, các nhãn case trong cấu trúc switch phải là hằng chứ không thể là biến hay biểu thức. Nếu cần so sánh với biến hay biểu thức, ta nên dùng khối lệnh if-else lồng nhau.
Vấn đề đặc biệt của cấu trúc switch là các lệnh break. Nếu ta không tự gắn một lệnh break vào cuối chuỗi lệnh cần thực hiện cho mỗi trường hợp, chương trình sẽ chạy tiếp chuỗi lệnh của trường hợp sau chứ không tự động nhảy tới cuối cấu trúc switch. Ví dụ, đoạn chương trình sau sẽ chạy lệnh in thứ nhất nếu grade nhận một trong ba giá trị 'A', 'B', 'C' và chạy lệnh in thứ hai trong trường hợp còn lại:
switch (grade){
    case "A":
    case "B":
    case "C":
        System.out.println("Grade is A, B or C.");
        break;
    default:
        System.out.println("Grade is not A, B or C.");
}
Chương trình dưới đây là một ví dụ hoàn chỉnh sử dụng cấu trúc switch để in ra các thông báo khác nhau tùy theo xếp loại học lực (grade) mà người dùng nhập từ bàn phím. Trong đó, case 'A' kết thúc với break sau chỉ một lệnh, còn case 'B' chạy tiếp qua case 'C', 'D' rồi mới gặp break và thoát khỏi lệnh switch. Nhãn default được dùng để xử lý trường hợp biến grade giữ giá trị không hợp lệ đối với xếp loại học lực. Trong nhiều chương trình, phần default thường được dùng để xử lý các trường hợp không mong đợi, chẳng hạn như để bắt lỗi các kí hiệu học lực không hợp lệ mà người dùng có thể nhập sai.
Có một lưu ý nhỏ là Scanner không hỗ trợ việc đọc từng kí tự một. Do đó, để đọc giá trị của grade do người dùng nhập, ta dùng phương thức next() để đọc một chuỗi (không chứa kí tự trắng), rồi lấy kí tự đầu tiên bằng hàm charAt(0) (mà kiểu String cung cấp) làm giá trị của grade.
import java.util.Scanner;

public class SwitchExample {

    public static void main(String[] args) {
        // write your code here
        Scanner input = new Scanner(System.in);
        String grade = "F";

        switch (grade){
            case "A":
                System.out.println("Excellent!");
                break;
            case "B":
                System.out.println("Great!");
                break;
            case "C":
            case "D":
                System.out.println("Well done!");
                break;
            case "F":
                System.out.println("Excellent!");
                break;
            default:
                System.out.println("Error! Invalid grade.");
        }
    }
}
Kết quả chạy chương trình


Post a Comment

Mới hơn Cũ hơn