Câu lệnh điều kiện trong Java (phần 1)
Giới thiệu
Trong bài viết này, chúng ta sẽ tìm hiểu về câu lệnh điều kiện trong Java, cụ thể về cách sử dụng câu lệnh if
để kiểm tra điều kiện luồng thực thi của chương trình, cũng như các biến thể của if
, bao gồm if - else
và if - else if - else
, để xử lý nhiều trường hợp khác nhau. Bên cạnh đó, bài viết cũng trình bày những lỗi thường gặp khi sử dụng câu lệnh điều kiện và cách tránh chúng.
if - else
Câu lệnh if
trong Java là một công cụ quan trọng để kiểm tra điều kiện và quyết định luồng thực thi của chương trình dựa trên kết quả của điều kiện đó. Câu lệnh if
cho phép bạn thực hiện một hành động nếu điều kiện đúng (true), và nếu điều kiện sai (false), bạn có thể chỉ định một hành động thay thế hoặc bỏ qua nó. Dưới đây là cách sử dụng câu lệnh if
trong Java:
if (điều kiện) {
// Khối mã thực thi nếu điều kiện đúng
}
điều kiện
là biểu thức logic trả về giá trị boolean (true hoặc false).- Khối mã nằm trong dấu ngoặc nhọn
{}
sẽ được thực thi nếu điều kiện đúng.
Ví dụ:
int age = 25;
if (age >= 18) {
System.out.println("Bạn đã đủ tuổi để lái xe.");
}
Trong ví dụ này, chúng ta kiểm tra giá trị của biến age
. Nếu age
lớn hơn hoặc bằng 18 (điều kiện đúng), thì dòng "Bạn đã đủ tuổi để lái xe." sẽ được in ra màn hình.
Câu lệnh if
có thể được kết hợp với else
để xác định hành động thực hiện khi điều kiện sai. Dưới đây là cú pháp:
if (điều kiện) {
// Khối mã thực thi nếu điều kiện đúng
} else {
// Khối mã thực thi nếu điều kiện sai
}
Ví dụ:
int age = 15;
if (age >= 18) {
System.out.println("Bạn đã đủ tuổi để lái xe.");
} else {
System.out.println("Bạn chưa đủ tuổi để lái xe.");
}
Trong ví dụ này, nếu age
không đủ 18 tuổi (điều kiện sai), thì dòng "Bạn chưa đủ tuổi để lái xe." sẽ được in ra.
if - else if - else
Câu lệnh if
có thể được kết hợp với nhiều câu lệnh else if
để kiểm tra nhiều điều kiện khác nhau theo thứ tự. Dưới đây là cú pháp:
if (điều kiện1) {
// Khối mã thực thi nếu điều kiện1 đúng
} else if (điều kiện2) {
// Khối mã thực thi nếu điều kiện1 sai và điều kiện2 đúng
} else {
// Khối mã thực thi nếu tất cả điều kiện đều sai
}
Câu lệnh else
cuối cùng là tùy chọn và sẽ thực thi nếu tất cả các điều kiện trước đó sai.
Ví dụ:
int score = 75;
if (score >= 90) {
System.out.println("Bạn đạt điểm A.");
} else if (score >= 80) {
System.out.println("Bạn đạt điểm B.");
} else if (score >= 70) {
System.out.println("Bạn đạt điểm C.");
} else {
System.out.println("Bạn đạt điểm D hoặc F.");
}
Trong ví dụ này, chúng ta kiểm tra giá trị của score
và in ra thông báo tương ứng dựa trên điểm số.
Câu lệnh if
là một phần quan trọng của kiểm soát luồng trong lập trình Java. Nó cho phép bạn tạo các quyết định logic và điều hướng luồng thực thi của chương trình dựa trên các điều kiện logic khác nhau.
if - else lồng nhau
Câu lệnh if-else
lồng nhau trong Java là một cách để kiểm tra nhiều điều kiện logic một cách tuần tự và chọn hành động tương ứng dựa trên kết quả của các điều kiện này. Khi sử dụng if-else
lồng nhau, bạn có thể đặt một câu lệnh if
bên trong một câu lệnh else
hoặc if
khác. Điều này cho phép bạn kiểm tra một loạt các điều kiện và thực hiện các hành động tùy thuộc vào điều kiện nào đúng.
Dưới đây là một ví dụ minh họa về cách sử dụng if-else
lồng nhau trong Java:
int age = 25;
boolean isStudent = false;
if (age < 18) {
System.out.println("Bạn là một người trẻ tuổi.");
if (isStudent) {
System.out.println("Và bạn là học sinh.");
} else {
System.out.println("Và bạn không phải là học sinh.");
}
} else {
System.out.println("Bạn là một người trưởng thành.");
if (isStudent) {
System.out.println("Nhưng bạn là học sinh.");
} else {
System.out.println("Và bạn không phải là học sinh.");
}
}
Trong ví dụ này:
-
Đầu tiên ta kiểm tra điều kiện
age < 18
(tuổi dưới 18). Nếu điều kiện này đúng, ta in ra thông báo "là một người trẻ tuổi" và sau đó kiểm tra xem họ có phải là học sinh hay không. -
Nếu
age < 18
sai (tuổi lớn hơn hoặc bằng 18), chúng ta in ra thông báo "là một người trưởng thành" và sau đó kiểm tra xem họ có phải là học sinh hay không.
Như vậy, việc sử dụng if-else
lồng nhau cho phép kiểm tra và thực hiện hành động tùy thuộc vào nhiều điều kiện phức tạp. Tuy nhiên, bạn nên lưu ý rằng việc lồng nhiều câu lệnh if-else
có thể làm cho code của bạn trở nên khó đọc và khó bảo trì, do đó, nên sử dụng chúng một cách cẩn thận và hợp lý.
Những lỗi sai thường gặp và lưu ý
Khi sử dụng câu lệnh điều kiện trong Java, có một số lỗi thường gặp và lưu ý quan trọng bạn cần xem xét để viết code chính xác và tránh sai lầm không cần thiết. Dưới đây là một số lỗi thường gặp và lưu ý:
-
Lỗi Cú pháp (Syntax Errors): Đảm bảo rằng bạn đã sử dụng cú pháp câu lệnh điều kiện đúng. Lỗi cú pháp xảy ra khi bạn vi phạm cú pháp ngôn ngữ Java. Ví dụ:
if (x < 5 { // Thiếu dấu ngoặc đóng System.out.println("Đúng"); }
Sửa lỗi cú pháp bằng cách đặt dấu ngoặc đóng đúng cách.
-
Lỗi Logic (Logic Errors): Đảm bảo rằng điều kiện kiểm tra logic của bạn chính xác. Lỗi logic xảy ra khi code của bạn không hoạt động theo cách bạn mong muốn, như kiểm tra ngược logic hoặc sai toán tử so sánh. Ví dụ:
if (x > 5) { System.out.println("Nhỏ hơn 5"); // Lỗi logic, nên là "Lớn hơn 5" }
Sửa lỗi logic bằng cách kiểm tra lại điều kiện và toán tử so sánh.
-
else treo lơ lửng
Lỗi "else treo lơ lửng" là một lỗi logic thường gặp trong câu lệnh điều kiện
if-else
của Java. Lỗi này xuất hiện khi có mộtelse
treo lơ lửng, điều này khiến cho mã nguồn trở nên mơ hồ và có thể gây hiểu lầm trong việc xác định câu lệnhif
hoặcelse
nào màelse
đóng gói. Để giải quyết lỗi này, Java sử dụng quy tắc "dangling-else" như sau:- Nếu có nhiều câu lệnh
if
và một câu lệnhelse
,else
luôn được gán vớiif
gần nhất chưa được gắn vớielse
.
Ví dụ về lỗi "else treo lơ lửng" và cách giải quyết:
if (condition1) if (condition2) statement1; else statement2;
Trong ví dụ này, lỗi mâu thuẫn xuất hiện vì
else
ở dưới không biết là nó liên kết vớiif (condition1)
hayif (condition2)
. Điều này dẫn đến mơ hồ về việc câu lệnh nào sẽ được thực thi khicondition1
vàcondition2
cùng làtrue
.Để giải quyết lỗi này, bạn nên sử dụng dấu ngoặc đơn
{}
để gắn rõ ràng các câu lệnh điều kiện:if (condition1) { if (condition2) statement1; } else { statement2; }
Việc sử dụng dấu ngoặc đơn giữa các câu lệnh
if
vàelse
giúp xác định rõ ràng câu lệnh nào thuộc vềif
và câu lệnh nào thuộc vềelse
, loại bỏ mâu thuẫn và đảm bảo rằng code của bạn hoạt động chính xác. - Nếu có nhiều câu lệnh
-
So Sánh Chuỗi (String Comparison): Khi bạn so sánh chuỗi bằng toán tử
==
, nó thực hiện so sánh địa chỉ bộ nhớ thay vì giá trị chuỗi. Điều này có thể dẫn đến sai sót trong kiểm tra chuỗi. Sử dụng phương thứcequals
để so sánh giá trị của chuỗi.String text1 = "Hello"; String text2 = "Hello"; if (text1 == text2) { System.out.println("Giống nhau"); // Có thể không in ra vì so sánh sai }
Sử dụng
if (text1.equals(text2))
để so sánh giá trị chuỗi. -
So sánh Số Thực (Floating-Point Comparison): So sánh số thực trong Java có thể gây ra lỗi không mong muốn vì số thực không thể biểu diễn chính xác trong máy tính. Điều này đặt ra một thách thức trong việc kiểm tra xem hai số thực có bằng nhau hay không. Dưới đây là cách giải quyết lỗi thường gặp khi so sánh số thực:
Khi bạn thực hiện so sánh số thực, ta sẽ phải sử dụng một ngưỡng (epsilon) để kiểm tra sự tương đồng giữa hai số thực thay vì so sánh trực tiếp bằng toán tử
==
.Ví dụ:
double a = 0.1 + 0.2; double b = 0.3; if (a == b) { System.out.println("Bằng nhau"); // Không in ra vì so sánh sai }
Trong ví dụ này, nếu bạn so sánh
a
vàb
bằng toán tử==
, nó sẽ trả vềfalse
, mặc dù logic nói rằng0.1 + 0.2
và0.3
nên bằng nhau. Nguyên nhân là do lỗi làm tròn số thực khi biểu diễn chúng trong máy tính.Thay vì so sánh trực tiếp, bạn nên sử dụng ngưỡng (epsilon) như sau:
double epsilon = 1e-15; // Giá trị epsilon có thể được điều chỉnh dựa trên mức độ chính xác bạn mong muốn if (Math.abs(a - b) < epsilon) { System.out.println("Bằng nhau"); // In ra bởi sử dụng epsilon để so sánh }
Trong ví dụ này, chúng ta sử dụng
Math.abs(a - b) < epsilon
để kiểm tra xem giữaa
vàb
có chênh lệch nhỏ hơn giá trị epsilon hay không. Nếu chênh lệch nhỏ hơn epsilon, chúng ta coi hai số là tương đồng và thực hiện câu lệnh bên trongif
.Nhớ rằng giá trị epsilon phải được chọn sao cho phù hợp với mức độ chính xác mà bạn mong muốn trong so sánh số thực. Giá trị quá lớn sẽ cho phép một sự chênh lệch lớn, trong khi giá trị quá nhỏ có thể gây ra nhiều sai số không mong muốn.
-
Kiểm Tra Null (Checking for Null): Trước khi thao tác với một đối tượng, hãy kiểm tra xem nó có giá trị
null
hay không để tránh lỗiNullPointerException
.String text = null; if (text != null) { System.out.println(text.length()); }
Kiểm tra giá trị
null
trước khi sử dụng phương thức hoặc thuộc tính của đối tượng.
Để tránh những lỗi sai này, luôn kiểm tra mã của bạn kỹ lưỡng và sử dụng kiểm thử để xác minh tính chính xác của mã.
Lời kết
Trong bài viết này, chúng ta đã tìm hiểu về câu lệnh if
và các biến thể của nó trong Java. Câu lệnh if
cho phép kiểm tra điều kiện và điều hướng luồng thực thi của chương trình dựa trên kết quả của điều kiện đó. Chúng ta đã tìm hiểu cách sử dụng câu lệnh if
, if-else
, và if-else if-else
để thực hiện các quyết định logic.
Ngoài ra, chúng ta cũng tìm hiểu cách sử dụng câu lệnh if-else
lồng nhau để kiểm tra nhiều điều kiện logic một cách tuần tự và tùy thuộc vào kết quả của các điều kiện để quyết định hành động tiếp theo.
Bên cạnh đó ta cũng bàn luận về các lỗi thường gặp khi sử dụng câu lệnh điều kiện và cách tránh chúng.
Hy vọng qua bài viết này, bạn có thể viết code Java chính xác và tránh được một số lỗi thường gặp. Câu lệnh if
và các biến thể của nó rất quan trọng trong kiểm soát luồng của chương trình và việc sử dụng chúng một cách chính xác sẽ làm cho ứng dụng của bạn hoạt động đúng theo mong đợi.
©️ Tác giả: Trần Quang Hiệp từ Viblo
All rights reserved