+1

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 - elseif - 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:

  1. Đầ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.

  2. 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 ý:

  1. 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.

  2. 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.

  3. 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ột else 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ệnh if hoặc else 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ệnh else, else luôn được gán với if gần nhất chưa được gắn với else.

    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ới if (condition1) hay if (condition2). Điều này dẫn đến mơ hồ về việc câu lệnh nào sẽ được thực thi khi condition1condition2 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 ifelse 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.

  4. 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ức equals để 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.

  5. 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 ab bằng toán tử ==, nó sẽ trả về false, mặc dù logic nói rằng 0.1 + 0.20.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ữa ab 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 trong if.

    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.

  6. 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ỗi NullPointerException.

    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

Viblo
Let's register a Viblo Account to get more interesting posts.