Khi học Java, việc nắm vững các câu lệnh trong Java là bước đầu tiên và quan trọng để làm chủ và phát triển các ứng dụng từ cơ bản đến nâng cao. Bài viết này sẽ giới thiệu tổng quan về các các câu lệnh trong Java, gồm các câu lệnh điều khiển, câu lệnh vòng lặp, câu lệnh rẽ nhánh và các câu lệnh khác những thực giúp lập trình viên viết mã hiệu quả hơn.

Đọc bài viết này để biết thêm chi tiết:

  • Các câu lệnh trong Java cơ bản
  • Các lệnh điều khiển luồng
  • Câu lệnh xử lý lỗi 
  • Các câu lệnh trong Java đặc biệt 

Phân loại cơ bản các câu lệnh trong Java

Các câu lệnh trong Java bao gồm:

  • Câu lệnh khai báo biến (Declaration Statement)
  • Câu lệnh gán giá trị (Assignment Statement)
  • Câu lệnh in ra màn hình (Print Statement)
  • Câu lệnh nhập liệu từ bàn phím (Input Statement)

Những câu lệnh này đóng vai trò quan trọng trong việc tổ chức, quản lý và xử lý dữ liệu trong chương trình Java. Chúng giúp lập trình viên xây dựng các ứng dụng đơn giản đến phức tạp một cách có hệ thống.

Đọc thêm: Java là gì? Tất cả những điều bạn cần biết về ngôn ngữ Java

Câu lệnh khai báo biến (Declaration Statement)

Câu lệnh khai báo dùng để khai báo các biến trong Java. Biến là vùng nhớ trong bộ nhớ máy tính được sử dụng để lưu trữ dữ liệu tạm thời trong quá trình chạy chương trình.

Cú pháp:

<kieu_du_lieu> <ten_bien>;

Ví dụ:

int age;
float salary;
String name;

Trong đó:

  • int, float, String là kiểu dữ liệu được sử dụng để xác định loại giá trị mà biến có thể lưu trữ.
  • age, salary, name là các tên biến được khai báo.

Giải thích:

  • int: dùng để lưu trữ số nguyên.
  • float: lưu trữ số thực với dấu chấm động.
  • String: dùng để lưu trữ chuỗi ký tự.

Khai báo biến là bước đầu tiên trong quá trình làm việc với dữ liệu trong Java.

Câu lệnh gán giá trị (Assignment Statement)

Câu lệnh gán giá trị dùng để gán một giá trị cụ thể cho biến đã được khai báo trước đó. Việc gán giá trị giúp biến có dữ liệu để sử dụng trong các thao tác tính toán hoặc hiển thị.

Cú pháp:

<ten_bien> = <gia_tri>;

Ví dụ:

age = 25;
salary = 1500.50f;
name = "Nguyen Van A";

Trong đó:

  • age, salary, name là các biến đã khai báo trước.
  • 25, 1500.50f, và “Nguyen Van A” là các giá trị được gán cho biến tương ứng.

Lưu ý:

  • Biến phải được khai báo trước khi gán giá trị.
  • Giá trị được gán phải tương thích với kiểu dữ liệu của biến.

Ví dụ hoàn chỉnh:

int age;

age = 30;

System.out.println("Tuổi của bạn là: " + age);

Câu lệnh in ra màn hình (Print Statement)

Câu lệnh in dùng để hiển thị thông tin hoặc dữ liệu ra màn hình. Trong Java, chúng ta thường sử dụng System.out.println hoặc System.out.print để thực hiện việc này.

Cú pháp:

System.out.println(<noi_dung>);
System.out.print(<noi_dung>);

Ví dụ:

System.out.println("Xin chào! Họ và tên: " + name);
System.out.println("Tuổi: " + age);
  • System.out.println: in nội dung ra màn hình và tự động xuống dòng mới.
  • System.out.print: in nội dung ra màn hình nhưng không xuống dòng mới.

Giải thích thêm: Câu lệnh này thường được dùng để hiển thị kết quả tính toán, thông báo, hoặc dữ liệu nhập từ người dùng. Việc sử dụng dấu + giúp nối chuỗi với biến hoặc các dữ liệu khác.

Ví dụ mở rộng:

int a = 10, b = 20;
System.out.println("Tổng của a và b là: " + (a + b));

Câu lệnh nhập liệu từ bàn phím (Input Statement)

Câu lệnh nhập liệu cho phép chương trình đọc dữ liệu do người dùng nhập vào từ bàn phím. Trong Java, chúng ta thường sử dụng lớp Scanner để thực hiện nhập liệu.

Bước 1: Import lớp Scanner

Trước khi sử dụng Scanner, cần import lớp này từ thư viện java.util:

import java.util.Scanner;

Bước 2: Khai báo đối tượng Scanner

Khai báo đối tượng Scanner để đọc dữ liệu từ bàn phím:

Scanner scanner = new Scanner(System.in);

Bước 3: Sử dụng Scanner để nhập dữ liệu

int age = scanner.nextInt();  // Nhập số nguyên
String name = scanner.nextLine();  // Nhập chuỗi
float salary = scanner.nextFloat(); // Nhập số thực

Ví dụ hoàn chỉnh:

import java.util.Scanner;

public class InputExample {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Nhập tên của bạn: ");
    String name = scanner.nextLine();

    System.out.print("Nhập tuổi của bạn: ");
    int age = scanner.nextInt();

    System.out.print("Nhập lương của bạn: ");
    float salary = scanner.nextFloat();

    System.out.println("Thông tin bạn vừa nhập:");
    System.out.println("Họ tên: " + name);
    System.out.println("Tuổi: " + age);
    System.out.println("Lương: " + salary);
  }
}

Giải thích:

  • nextInt(): đọc số nguyên.
  • nextFloat(): đọc số thực.
  • nextLine(): đọc chuỗi ký tự.
  • Người dùng nhập dữ liệu và nhấn Enter để chương trình tiếp tục chạy.

Lưu ý:

  • Scanner cần được đóng lại sau khi sử dụng bằng scanner.close() để tránh rò rỉ bộ nhớ.

Trên đây là các loại câu lệnh cơ bản trong Java, bao gồm khai báo biến, gán giá trị, in dữ liệu ra màn hình và nhập liệu từ bàn phím.

Các câu lệnh trong Java dùng để điều khiển luồng

Trong lập trình Java, các câu lệnh điều khiển luồng đóng vai trò quan trọng trong việc xác định luồng thực thi của chương trình.

Dưới đây là các loại câu lệnh điều khiển luồng phổ biến:

Câu lệnh if (Điều kiện đơn)

Câu lệnh if được sử dụng để kiểm tra một điều kiện cụ thể và thực thi khối lệnh nếu điều kiện đó đúng (true).

Cú pháp:

if (điều kiện) {
    // Khối lệnh sẽ thực thi nếu điều kiện đúng
}

Ví dụ:
int age = 18;
if (age >= 18) {
    System.out.println("Bạn đủ tuổi để tham gia.");
}

Câu lệnh if-else (Điều kiện kép)

Câu lệnh if-else cho phép chương trình thực thi một khối lệnh khi điều kiện đúng và một khối lệnh khác khi điều kiện sai.

Cú pháp:

if (điều kiện) {
    // Khối lệnh thực thi khi điều kiện đúng
} else {
    // Khối lệnh thực thi khi điều kiện sai
}

Ví dụ:

int score = 75;
if (score >= 50) {
    System.out.println("Bạn đã đậu.");
} else {
    System.out.println("Bạn đã trượt.");
}

Câu lệnh switch-case (Điều kiện nhiều lựa chọn)

Câu lệnh switch-case được sử dụng khi bạn cần kiểm tra một giá trị với nhiều trường hợp (case) khác nhau.

Cú pháp:

switch (biểu thức) {
  case giá_trị_1:
    // Khối lệnh khi biểu thức bang giá_trị_1
    break;
  case giá_trị_2:
    // Khối lệnh khi biểu thức bang giá trị_2
    break;
  default:
    // Khối lệnh khi không có case nào khớp
}

Ví dụ:

int day = 3;
switch (day) {
  case 1:
    System.out.println("Thứ Hai");
    break;
  case 2:
    System.out.println("Thứ Ba");
    break;
  case 3:
    System.out.println("Thứ Tư");
    break;
  default:
    System.out.println("Ngày không hợp lệ");
}

Câu lệnh vòng lặp (for, while, do-while)

Vòng lặp for

Dùng khi bạn biết trước số lần lặp.

Cú pháp:

for (khởi_tạo; điều_kiện; bước_nhảy) {
    // Khối lệnh lặp lại
}

Ví dụ:

for (int i = 1; i <= 5; i++) {
    System.out.println("Lần lặp: " + i);
}

Vòng lặp while

Dùng khi bạn chưa biết trước số lần lặp nhưng có điều kiện dừng.

Cú pháp:

while (điều_kiện) {
    // Khối lệnh lặp lại
}

Ví dụ:

int i = 1;
while (i <= 5) {
    System.out.println("Lần lặp: " + i);
    i++;
}

Vòng lặp do-while

Dùng khi bạn muốn khối lệnh được thực thi ít nhất một lần, dù điều kiện sai.

Cú pháp:

do {
    // Khối lệnh lặp lại
} while (điều_kiện);

Ví dụ:

int i = 1;
do {
    System.out.println("Lần lặp: " + i);
    i++;
} while (i <= 5);

Câu lệnh break

Câu lệnh break được sử dụng để thoát khỏi vòng lặp hoặc câu lệnh switch.

Ví dụ:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        break; // Thoát khỏi vòng lặp khi i = 3
    }
    System.out.println("i = " + i);
}

Kết quả:

i = 1

i = 2

Câu lệnh continue

Câu lệnh continue được sử dụng để bỏ qua phần còn lại của vòng lặp hiện tại và chuyển sang vòng lặp tiếp theo.

Ví dụ:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue; // Bỏ qua vòng lặp khi i = 3
    }
    System.out.println("i = " + i);
}

Kết quả:

i = 1  

i = 2  

i = 4  

i = 5  

Các câu lệnh điều khiển luồng trong Java như if, if-else, switch-case, và các vòng lặp for, while, do-while giúp lập trình viên điều khiển luồng thực thi chương trình một cách linh hoạt.

Câu lệnh breakcontinue đóng vai trò quan trọng trong việc kiểm soát quá trình lặp, giúp chương trình hoạt động hiệu quả hơn.

Các câu lệnh trong Java dùng để xử lý lỗi 

Trong Java, việc xử lý lỗi và ngoại lệ là một phần quan trọng giúp đảm bảo chương trình chạy ổn định, tránh tình trạng gián đoạn do các lỗi phát sinh. Các câu lệnh xử lý lỗi giúp kiểm soát và quản lý các tình huống không mong đợi như lỗi logic, lỗi nhập liệu hoặc các vấn đề trong quá trình thực thi chương trình.

Java cung cấp các khối lệnh try, catch, finally, và từ khóa throw để xử lý ngoại lệ. Cùng tìm hiểu chi tiết từng câu lệnh sau đây:

Câu lệnh try-catch (Xử lý ngoại lệ)

Mục đích:

  • try-catch được sử dụng để bắt và xử lý các ngoại lệ xảy ra trong chương trình, đảm bảo chương trình không bị dừng đột ngột.

Cách hoạt động:

  • Khối try chứa đoạn mã có thể gây ra ngoại lệ.
  • Khối catch sẽ xử lý ngoại lệ nếu có xảy ra trong khối try.

Cú pháp:

try {
    // Code có thể gây ra ngoại lệ
} catch (LoaiNgoaiLe e) {
    // Xử lý ngoại lệ
}

Ví dụ:

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // Lỗi chia cho 0
        } catch (ArithmeticException e) {
            System.out.println("Có lỗi xảy ra: " + e.getMessage());
        }
        System.out.println("Chương trình tiếp tục chạy...");
    }
}

Output:

Có lỗi xảy ra: / by zero
Chương trình tiếp tục chạy...

Câu lệnh throw (Ném ngoại lệ)

Mục đích:

Từ khóa throw được dùng để ném một ngoại lệ cụ thể. Nó thường được sử dụng trong các tình huống bạn muốn kiểm soát ngoại lệ theo logic riêng của chương trình.

Cách hoạt động:

Sau từ khóa throw, bạn phải chỉ định một đối tượng ngoại lệ (instance của Throwable hoặc các lớp con).

Cú pháp:

throw new LoaiNgoaiLe("Thông báo lỗi");

Ví dụ:

public class ThrowExample {
  static void validateAge(int age) {
    if (age<18) {
      throw new IllegalArgumentException("Tuổi không đủ điều kiện!");
    } else {
      System.out.println("Tuổi hợp lệ.");
    }
  }

  public static void main(String[] args) {
    try {
      validateAge(16); // Ném ngoại lệ
    } catch (IllegalArgumentException e) {
      System.out.println("Lỗi: " + e.getMessage());
    }
    System.out.println("Chương trình tiếp tục chạy...");
  }
}

Output:

Lỗi: Tuổi không đủ điều kiện!
Chương trình tiếp tục chạy...

Câu lệnh finally (Khối mã luôn thực thi)

Mục đích:

  • finally là khối mã luôn được thực thi sau khi kết thúc try-catch, cho dù có xảy ra ngoại lệ hay không.
  • Thường được sử dụng để đóng tài nguyên (file, kết nối database, v.v.) nhằm đảm bảo hệ thống không bị rò rỉ tài nguyên.

Cú pháp:

try {
    // Code có thể gây ra ngoại lệ
} catch (LoaiNgoaiLe e) {
    // Xử lý ngoại lệ
} finally {
    // Khối mã luôn thực thi
}

Ví dụ:

public class FinallyExample {
  public static void main(String[] args) {
    try {
      int result = 10 / 0; // Lỗi chia cho 0
    } catch (ArithmeticException e) {
      System.out.println("Có lỗi xảy ra: " + e.getMessage());
    } finally {
      System.out.println("Khối finally luôn được thực thi.");
    }
    System.out.println("Chương trình tiếp tục chạy...");
  }
}

Output:

Có lỗi xảy ra: / by zero
Khối finally luôn được thực thi.
Chương trình tiếp tục chạy...

Tóm lại

Trong Java, các câu lệnh xử lý lỗi như try-catch, throw, và finally giúp lập trình viên kiểm soát được các tình huống bất thường trong quá trình thực thi chương trình.

  • try-catch: Bắt và xử lý ngoại lệ.
  • throw: Ném ngoại lệ theo ý định của lập trình viên.
  • finally: Đảm bảo thực thi đoạn mã quan trọng bất kể có xảy ra ngoại lệ hay không.

Hiểu và sử dụng linh hoạt các câu lệnh này sẽ giúp chương trình Java trở nên an toàn, ổn định và dễ bảo trì hơn.

Các câu lệnh trong Java đặc biệt 

Java cung cấp nhiều câu lệnh khác nhau để lập trình viên xây dựng và kiểm soát luồng chương trình. Trong bài viết này, chúng ta sẽ tập trung vào các câu lệnh đặc biệt gồm: return, assert, và synchronized.

Câu lệnh return (Trả giá trị về)

Câu lệnh return được sử dụng để kết thúc một phương thức và trả về một giá trị cho nơi gọi phương thức (nếu có). Đây là câu lệnh phổ biến trong Java, đặc biệt trong các hàm có giá trị trả về.

Cú pháp

return [giá trị];
  • Nếu phương thức có kiểu trả về (ví dụ: int, String), return sẽ trả về một giá trị tương ứng.
  • Nếu phương thức có kiểu void, câu lệnh return sẽ không cần giá trị đi kèm.

Ví dụ:

public int add(int a, int b) {
  return a + b; // Trả về tổng của a và b
}

public void displayMessage() {
  System.out.println("Hello, World!");
  return; // Kết thúc phương thức, có thể bỏ qua return ở kiểu void
}

Lưu ý:

  • Khi gặp return, chương trình sẽ kết thúc ngay tại câu lệnh đó và không thực thi các lệnh sau trong phương thức.
  • Trong các vòng lặp, nếu dùng return, vòng lặp sẽ kết thúc cùng với phương thức.

Câu lệnh assert (Kiểm tra giả định) 

Câu lệnh assert được sử dụng để kiểm tra các điều kiện mà lập trình viên giả định là đúng. Nếu điều kiện sai, chương trình sẽ ném ra ngoại lệ AssertionError.

Câu lệnh này chủ yếu được sử dụng để phát hiện lỗi trong quá trình phát triển và debug chương trình.

Cú pháp

assert biểu_thức_logic : biểu_thức_giải_thích;
  • biểu_thức_logic: Điều kiện cần kiểm tra.
  • biểu_thức_giải_thích (tùy chọn): Thông báo hoặc giá trị kèm theo khi điều kiện không đúng.

Ví dụ:

public static void main(String[] args) {
  int number = -1;
  assert number >= 0 : "Số phải không âm";
  System.out.println("Giá trị của số: " + number);
}

Kết quả:

  • Nếu number >= 0, chương trình tiếp tục chạy bình thường.
  • Nếu number < 0, chương trình sẽ ném ra AssertionError với thông báo: “Số phải không âm”.

Lưu ý

  • Câu lệnh assert bị vô hiệu hóa mặc định khi chạy chương trình. Để kích hoạt, cần dùng tùy chọn -ea (enable assertions) khi chạy Java.
    Ví dụ: java -ea MyProgram
  • Không nên dùng assert để xử lý lỗi logic quan trọng trong môi trường production.

Câu lệnh synchronized (Đồng bộ hóa)

Câu lệnh synchronized được sử dụng để đảm bảo tính toàn vẹn dữ liệu trong lập trình đa luồng (multithreading). Nó cho phép chỉ một luồng được truy cập vào một đoạn mã hoặc tài nguyên cụ thể trong cùng một thời điểm.

Mục đích

Tránh xung đột dữ liệu và đảm bảo an toàn khi nhiều luồng cùng truy cập và chỉnh sửa dữ liệu.

Cú pháp

Sử dụng synchronized trên một phương thức:

public synchronized void method() {
    // Đoạn mã chỉ được truy cập bởi một luồng tại một thời điểm
}

Sử dụng synchronized trên một khối mã:

synchronized (object) {

    // Đoạn mã đồng bộ hóa dựa trên object

}

Ví dụ:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class SynchronizedExample {
    public static void main(String[] args) {
        Counter counter = new Counter();

        // Tạo và chạy nhiều luồng
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Giá trị cuối cùng của count: " + counter.getCount());
    }
}

Kết quả:

Do sử dụng synchronized, các luồng sẽ truy cập vào phương thức increment() một cách tuần tự. Kết quả đảm bảo chính xác, không bị mất dữ liệu khi tăng giá trị count.

Lưu ý

  • Tránh lạm dụng synchronized vì có thể làm giảm hiệu suất chương trình.
  • Trong các trường hợp phức tạp, bạn có thể sử dụng các công cụ như ReentrantLock để quản lý đồng bộ hóa thay cho synchronized.

Trong Java, các câu lệnh đặc biệt như return, assert, và synchronized đóng vai trò quan trọng trong việc kiểm soát luồng chương trình, kiểm tra giả định, và xử lý lập trình đa luồng. Việc hiểu và sử dụng đúng các câu lệnh này sẽ giúp bạn viết mã hiệu quả, bảo trì dễ dàng và đảm bảo tính toàn vẹn dữ liệu trong ứng dụng.

Tổng kết các câu lệnh trong Java

Nắm vững các câu lệnh trong Java là nền tảng quan trọng để phát triển các ứng dụng Java từ đơn giản đến phức tạp. Từ những câu lệnh cơ bản như khai báo biến, điều kiện, vòng lặp cho đến các câu lệnh điều khiển luồng chương trình như break, continue, và return, mỗi câu lệnh đều đóng một vai trò thiết yếu trong việc xây dựng logic và tối ưu hóa mã nguồn.

Việc hiểu rõ và áp dụng thành thạo các câu lệnh này không chỉ giúp bạn viết mã hiệu quả hơn mà còn nâng cao khả năng giải quyết vấn đề và tư duy lập trình. Hãy thường xuyên thực hành và thử nghiệm để làm chủ các khái niệm này, từ đó tiến xa hơn trong hành trình trở thành một lập trình viên Java chuyên nghiệp.

Đọc thêm: Top 40+ câu hỏi phỏng vấn Java nhất định có trong buổi phỏng vấn