Menu

Câu lệnh if-else trong Java: điều kiện và ví dụ

Cách ra quyết định trong Java với if, else if và else: điều kiện boolean, nối các nhánh, lồng nhau, toán tử ba ngôi, và những lỗi người học hay mắc.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Ra quyết định với if

Chương trình cần phản ứng với dữ liệu: đạt hay trượt, còn hàng hay hết hàng, hợp lệ hay không. Câu lệnh if là cách Java chọn đoạn code nào sẽ chạy dựa trên một điều kiện.

if nhận một điều kiện boolean trong ngoặc tròn và chỉ chạy khối lệnh trong ngoặc nhọn khi điều kiện đó là true:

Điều kiện score >= 60 là true, nên thông báo được in ra. Dòng sau dấu ngoặc nhọn đóng luôn chạy, vì nó nằm ngoài if. Đổi score thành 40 thì dòng "passed" bị bỏ qua hoàn toàn.

Khác với C, Java không cho bạn đặt một con số vào chỗ cần boolean. if (score) là lỗi biên dịch: điều kiện phải là một biểu thức boolean thật sự, tạo từ các phép so sánh (>, >=, ==, !=) hoặc logic boolean (&&, ||, !).

Thêm else

else cho bạn nhánh "ngược lại": đoạn code chỉ chạy khi điều kiện là false:

Đúng một trong hai khối sẽ chạy: không bao giờ cả hai, cũng không bao giờ không khối nào. else không có điều kiện riêng; nó chỉ đơn giản đón mọi trường hợp mà if không bắt được.

Nối nhiều nhánh với else if

Khi có hơn hai kết quả, hãy nối các điều kiện bằng else if. Java kiểm tra chúng từ trên xuống và chạy khối đầu tiên có điều kiện đúng, rồi bỏ qua phần còn lại:

Thứ tự rất quan trọng. Vì 84 được so với >= 90 trước (sai), rồi >= 80 (đúng), nên nó dừng ở B và không hề kiểm tra các ngưỡng thấp hơn. Đó cũng là lý do bạn không cần viết score >= 80 && score < 90: tới được nhánh thứ hai đã đảm bảo score nhỏ hơn 90. Hãy đặt điều kiện hẹp nhất hoặc ưu tiên cao nhất lên đầu.

else ở cuối là nhánh đón mọi trường hợp còn lại. Bỏ nó đi ở đây sẽ gây lỗi biên dịch, vì grade có thể chưa được gán khi bạn in ra.

So sánh giá trị: == và equals()

Lỗi phổ biến nhất với câu lệnh if trong Java là so sánh chuỗi bằng ==. Với kiểu nguyên thủy (int, double, char, boolean), == là đúng. Với đối tượng, == hỏi "đây có phải cùng một đối tượng trong bộ nhớ không?" còn .equals() hỏi "chúng có cùng nội dung không?", và gần như lúc nào bạn cũng cần câu hỏi thứ hai:

Chỉ thông báo thứ hai được in ra. new String("yes") là một đối tượng khác với literal "yes", nên == cho false, nhưng nội dung văn bản giống hệt nhau, nên .equals() cho true. Quy tắc dễ nhớ: kiểu nguyên thủy dùng ==, đối tượng dùng .equals().

Một mẹo an toàn để tránh NullPointerException khi biến có thể là null: đặt literal lên trước, if ("yes".equals(input)), vì literal không bao giờ là null.

Kết hợp và lồng điều kiện

Bạn có thể kết hợp điều kiện bằng && (và), || (hoặc) và ! (phủ định), hoặc lồng một if vào trong một if khác khi một phép kiểm tra chỉ có nghĩa sau khi phép kiểm tra trước đã đúng:

&& và || có cơ chế đoản mạch (short-circuit): trong a && b, nếu a sai thì Java không bao giờ tính b. Điều này rất tiện để phòng lỗi: if (s != null && s.length() > 0) an toàn vì phép kiểm tra độ dài bị bỏ qua khi s là null. Khi có thể, hãy ưu tiên kết hợp bằng && thay vì lồng sâu; code phẳng dễ đọc hơn một kim tự tháp ngoặc nhọn.

Một lỗi kinh điển: một dấu = là phép gán, == mới là phép so sánh. Viết if (x = 5) với int là lỗi biên dịch (tốt), nhưng if (flag = true) với boolean vẫn biên dịch được và lặng lẽ gán giá trị: hãy để ý điều này.

Toán tử ba ngôi

Khi tất cả những gì bạn cần là chọn giữa hai giá trị, toán tử ba ngôi ?: là cách viết một dòng gọn gàng. Hãy đọc condition ? a : b là "nếu condition thì a, ngược lại thì b":

Toán tử ba ngôi cho ra một giá trị mà bạn có thể gán hoặc truyền trực tiếp. Hãy chỉ dùng nó để chọn giá trị đơn giản: nếu nhánh nào cần nhiều câu lệnh hoặc logic thật sự, một if-else đầy đủ vẫn dễ đọc, trong khi toán tử ba ngôi lồng nhau nhanh chóng trở thành câu đố.

Một cái bẫy: bỏ ngoặc nhọn

Java cho phép bỏ ngoặc nhọn khi một nhánh chỉ có một câu lệnh, nhưng điều này dễ dẫn tới một bug tinh vi. Thụt lề đánh lừa bạn:

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

Chỉ dòng đầu tiên chịu sự điều khiển của if; dòng thứ hai luôn chạy, dù thụt lề gợi ý điều ngược lại. Hãy luôn dùng ngoặc nhọn, kể cả khi chỉ có một dòng, và cả loại lỗi này sẽ biến mất.

Tiếp theo: switch

Chuỗi if-else if rất hợp khi mỗi nhánh kiểm tra một điều kiện khác nhau. Nhưng khi bạn so một giá trị với nhiều khả năng cố định, như tên ngày, lựa chọn trong menu hay một enum, một chuỗi else if dài sẽ trở nên lặp lại. Câu lệnh switch được tạo ra đúng cho việc đó, và đó là nội dung trang tiếp theo.

Câu hỏi thường gặp

Viết câu lệnh if-else trong Java như thế nào?

Đặt một điều kiện boolean trong ngoặc tròn sau if, rồi đến đoạn code cần chạy trong ngoặc nhọn, và một khối else tùy chọn cho trường hợp điều kiện sai: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. Điều kiện phải cho ra một giá trị boolean: Java không chấp nhận một int như C.

Trong câu lệnh if của Java, == và equals() khác nhau thế nào?

== so sánh xem hai tham chiếu có trỏ tới cùng một đối tượng hay không, còn .equals() so sánh nội dung. Với kiểu nguyên thủy như int, dùng ==. Với đối tượng, nhất là String, dùng .equals(): viết if (name.equals("Sam")), không viết if (name == "Sam"). Dùng == với chuỗi là lỗi phổ biến nhất khi viết câu lệnh if trong Java.

Toán tử ba ngôi trong Java là gì?

Toán tử ba ngôi (ternary operator) condition ? valueIfTrue : valueIfFalse là một dạng if-else rút gọn cho ra một giá trị. Ví dụ String label = age >= 18 ? "adult" : "minor"; gán một trong hai giá trị tùy theo điều kiện. Hãy dùng nó để chọn giá trị đơn giản; khi mỗi nhánh có logic cần chạy, hãy dùng if-else đầy đủ.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu