Cách khắc phục lỗi java.lang.ArrayIndexOutOfBoundsException: Index X out of bounds for length Y

beginner Java2026-04-04| Java Runtime Environment (JRE) / Java Development Kit (JDK) - Mọi phiên bản

Error Message

java.lang.ArrayIndexOutOfBoundsException: Index X out of bounds for length Y
#java#mảng#chỉ số#ngoại lệ#ArrayIndexOutOfBoundsException

TL;DR: Cách khắc phục nhanh

Ngoại lệ java.lang.ArrayIndexOutOfBoundsException xảy ra khi bạn cố gắng truy cập một phần tử mảng tại một chỉ số (index) không tồn tại. Trong Java, các mảng được đánh số chỉ số bắt đầu từ 0, nghĩa là phạm vi hợp lệ là từ 0 đến length - 1.

Để khắc phục lỗi này ngay lập tức, hãy đảm bảo chỉ số của bạn thỏa mãn điều kiện sau:

if (index >= 0 && index < array.length) {
    // An toàn để truy cập
    System.out.println(array[index]);
}

Thông thường, lỗi này xảy ra trong các vòng lặp nơi điều kiện thoát là i <= array.length. Hãy đổi nó thành i < array.length.

Hiểu rõ nguyên nhân gốc rễ

Các mảng trong Java là các cấu trúc có kích thước cố định. Khi JVM thực thi một dòng mã yêu cầu một chỉ số nằm ngoài phạm vi bộ nhớ được cấp phát của mảng đó, nó sẽ ném ra ngoại lệ runtime này để ngăn chặn việc làm hỏng bộ nhớ hoặc các hành vi không dự đoán trước được.

Thông báo lỗi thường cho bạn biết chính xác điều gì đã xảy ra:

java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

Trong ví dụ này, mảng có 5 vị trí (các chỉ số 0, 1, 2, 3, 4). Việc yêu cầu chỉ số 5 là không hợp lệ vì chỉ số cao nhất hiện có luôn là length - 1.

Các tình huống phổ biến

- **Lỗi vòng lặp sai lệch một đơn vị (Off-by-One):** Sử dụng `<=` thay vì `<` trong phần đầu của vòng lặp for.
- **Mảng rỗng:** Cố gắng truy cập `array[0]` trên một mảng có độ dài bằng 0.
- **Chỉ số được gán cứng (Hardcoded):** Giả định rằng một mảng sẽ luôn có một kích thước nhất định mà không kiểm tra trước.
- **Chỉ số âm:** Vô tình tính toán ra một số âm cho một chỉ số (ví dụ: `i - 1` khi `i` bằng 0).

Các phương pháp khắc phục từng bước

1. Sửa lại ranh giới vòng lặp

Đây là nguyên nhân thường gặp nhất. Các lập trình viên mới thường nhầm lẫn giữa độ dài của mảng với chỉ số cuối cùng.

Mã lỗi:

int[] numbers = {10, 20, 30};
for (int i = 0; i <= numbers.length; i++) {
    System.out.println(numbers[i]); // Ném ra ngoại lệ khi i đạt đến 3
}

Mã đã sửa:

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]); // Đúng: lặp qua 0, 1, 2
}

2. Sử dụng vòng lặp For cải tiến (For-Each)

Nếu bạn không cần số chỉ số thực tế cho logic mà chỉ cần dữ liệu bên trong, hãy sử dụng vòng lặp for cải tiến. Cú pháp này giúp loại bỏ hoàn toàn khả năng xảy ra lỗi ArrayIndexOutOfBoundsException vì logic lặp được JVM xử lý.

String[] names = {"Alice", "Bob", "Charlie"};
for (String name : names) {
    System.out.println(name);
}

3. Kiểm tra ranh giới phòng vệ

Khi làm việc với đầu vào động hoặc dữ liệu đến từ cơ sở dữ liệu/API, hãy luôn xác thực chỉ số trước khi sử dụng. Điều này đặc biệt quan trọng đối với các đối số CLI hoặc các chỉ số do người dùng gửi.

public void processElement(String[] data, int targetIndex) {
    if (data == null || data.length == 0) {
        System.err.println("Array is empty or null");
        return;
    }

    if (targetIndex < 0 || targetIndex >= data.length) {
        System.err.println("Invalid index: " + targetIndex);
        return;
    }

    System.out.println("Data: " + data[targetIndex]);
}

4. Gỡ lỗi tính toán chỉ số

Nếu chỉ số của bạn là kết quả của một phép tính (như array[i + j - 1]), hãy in giá trị đã tính toán ngay trước điểm xảy ra lỗi để xem chính xác con số nào đang được tạo ra.

int calculatedIndex = i + j - 1;
System.out.println("Debug: accessing index " + calculatedIndex + " for length " + array.length);
System.out.println(array[calculatedIndex]);

Xác minh cách khắc phục

Để xác nhận cách khắc phục của bạn hoạt động, bạn nên kiểm tra các điều kiện biên của mảng:

- **Kiểm tra với một mảng rỗng:** Mã của bạn có xử lý `length == 0` một cách ổn thỏa mà không bị lỗi không?
- **Kiểm tra với mảng có một phần tử:** Đảm bảo nó đọc `chỉ số 0` và dừng lại.
- **Kiểm thử đơn vị tự động (Automated Unit Tests):** Sử dụng JUnit để xác minh rằng các phương thức của bạn trả về các giá trị mong đợi hoặc xử lý lỗi đúng cách khi truyền các chỉ số ngoài phạm vi.
@Test(expected = ArrayIndexOutOfBoundsException.class)
public void testInvalidAccess() {
    int[] arr = {1, 2};
    int fail = arr[2]; // Việc này sẽ thất bại, cho phép bạn kiểm tra logic xử lý lỗi của mình
}

Đọc thêm

- [Tài liệu chính thức của Oracle: ArrayIndexOutOfBoundsException](https://docs.oracle.com/javase/8/docs/api/java/lang/ArrayIndexOutOfBoundsException.html)
- [Hướng dẫn về Java: Mảng](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)
- [Baeldung: Hướng dẫn về ArrayIndexOutOfBoundsException](https://www.baeldung.com/java-array-index-out-of-bounds)

Related Error Notes