if/else và switch
Đơn từ 500.000đ thì miễn phí ship, khách VIP được giảm giá, mỗi hình thức
thanh toán xử lý một kiểu. Chương trình cần chọn làm việc này hay việc kia tuỳ
điều kiện. Đó là nhiệm vụ của if và switch.
Khái niệm
🔀 if/else: chạy một khối code khi điều kiện đúng, và khối khác khi điều kiện sai.
🎛️ switch: chọn một nhánh để chạy dựa trên giá trị cụ thể của một biến.
Điều kiện trong if phải là một giá trị boolean, thường là kết quả của phép
so sánh như total > 500000.
Ví dụ
void main() {
long total = 350000;
long shippingFee;
if (total >= 500000) {
shippingFee = 0;
} else if (total >= 200000) {
shippingFee = 15000;
} else {
shippingFee = 30000;
}
System.out.println(shippingFee); // 15000
}- Java xét từng điều kiện từ trên xuống, gặp điều kiện đúng đầu tiên thì chạy khối đó rồi bỏ qua phần còn lại.
else ifthêm điều kiện tiếp theo,elselà trường hợp còn lại.- Code bên trong mỗi nhánh đặt trong cặp ngoặc
{ }.
switch
Khi so một biến với nhiều giá trị cụ thể, switch gọn hơn một chuỗi
else if:
void main() {
String payment = "card";
switch (payment) {
case "cash":
System.out.println("Thu tiền khi giao");
break;
case "card":
System.out.println("Trừ tiền qua thẻ");
break;
default:
System.out.println("Không hỗ trợ");
break;
}
}- Mỗi
caselà một giá trị cần so, kết thúc bằngbreak. defaultchạy khi khôngcasenào khớp.
Thử ngay
Dán vào Main.java, đổi giá trị total vài lần rồi chạy java Main.java:
void main() {
long total = 500000;
if (total > 500000) {
System.out.println("Miễn phí ship");
} else {
System.out.println("Phí ship 30000");
}
}Đoán trước khi chạy: với total bằng đúng 500000, dòng nào được in?
Xem kết quả
Phí ship 30000500000 > 500000 là sai, nên chương trình chạy nhánh else. Muốn tính cả
mốc 500000 thì phải dùng >=.
Lỗi hay gặp
Dùng = thay cho ==. = là gán, không phải so sánh.
// SAI — lỗi compile: điều kiện phải là boolean
void main() {
int quantity = 0;
if (quantity = 0) {
System.out.println("Hết hàng");
}
}// ĐÚNG
void main() {
int quantity = 0;
if (quantity == 0) {
System.out.println("Hết hàng");
}
}Quên break trong switch. Java không báo lỗi, mà chạy tràn sang case
kế tiếp.
// SAI — in cả "Đơn mới" lẫn "Đã thanh toán"
void main() {
String status = "new";
switch (status) {
case "new":
System.out.println("Đơn mới");
case "paid":
System.out.println("Đã thanh toán");
break;
}
}// ĐÚNG
void main() {
String status = "new";
switch (status) {
case "new":
System.out.println("Đơn mới");
break;
case "paid":
System.out.println("Đã thanh toán");
break;
}
}Tóm tắt
if/else if/elsexét điều kiện từ trên xuống, chỉ chạy nhánh đúng đầu tiên.- Điều kiện phải là
boolean. So sánh dùng==, không dùng=. switchgọn hơn khi so một biến với nhiều giá trị cụ thể.- Mỗi
casekết thúc bằngbreak,defaultbắt mọi trường hợp còn lại. - Java còn cách viết
case "cash" ->, không cầnbreakvà không chạy tràn.
Tự kiểm tra
0/3 câuint stock = 3; if (stock > 10) {...} else if (stock > 0) {...} else {...}. Nhánh nào chạy?
Trong switch, không case nào khớp với giá trị của biến. Chuyện gì xảy ra?
Bạn cần phân loại khách theo 4 hạng cố định: "silver", "gold", "platinum", "diamond". Cách viết nào gọn nhất?