Tại sao lại xảy ra lỗi IndexOutofbounds trong Java?

Khi chúng ta thao tác với một mảng trong Java thì mỗi phần tử sẽ tương ứng với một chỉ số, chỉ số này là một số nguyên có giá trị trong khoảng [0, n -1] với n là số lượng phần tử của mảng. Nếu chúng ta truy xuất các phần tử của mảng thông qua một chỉ số có giá trị âm hay lớn hơn hoặc bằng số lượng phần tử của mảng Java sẽ ném ra ArrayIndexOutOfBounds exception để chỉ ra rằng bạn đang truy xuất một vị trí không thuộc trong miền giá trị của mảng. 

ArrayIndexOutOfBoundsException là một RuntimeException vì thế trình biên dịch sẽ không thể kiểm tra những lỗi này tại thời điểm biên dịch. Khi gặp lỗi này, chắc chắn phải phải sữa mã nguồn để ứng dụng có thể chạy bình thường.

 

public class Main {
    public static void main(String[] ag) {
        int ar[] = {1, 2, 3, 4, 5};
        for (int i=0; i<=ar.length; i++){
            System.out.println(ar[i]);
        }

    }
}

Output

1
2
3
4
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Main.main(Main.java:5)

Ở đây chúng ta hãy cẩn thận để ý rằng kích thước của mảng là 5. Vì vậy chỉ số lớn nhất chúng ta có thể truy xuất trong mảng là 4, thế nhưng vòng lặp lại  duyệt đến <=ar.length nghĩa là chỉ số cuối cùng được duyệt là 5 lớn hơn 4 do đó gây ra exception. 

Việc này cũng có thể xảy ra với các collection như ArrayList

import java.util.ArrayList; 
public class NewClass2 
{ 
    public static void main(String[] args) 
    { 
        ArrayList<String> lis = new ArrayList<>(); 
        lis.add("My"); 
        lis.add("Name"); 
        System.out.println(lis.get(2)); 
    } 
} 

Chỉ số lớn nhất của ArrayList có thể truy xuất là 1.

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at NewClass2.main(NewClass2.java:7)

Như vậy để giải quyết những lỗi không đáng có như vậy chúng ta hãy nhớ chỉ áp dụng điều kiện trong trong vòng lặp for là bé hơn thôi nhé, không có dấu bằng

for (int i=0; i<ar.length; i++) 
{
}

Xử lý exception

Nếu chỉ có nhu cầu duyệt các phần tử trong mảng chúng ta nên sử dụng vòng lặp for-each để khỏi cần quan tâm đến chỉ số của mảng

for(int m : ar){
}

Đây là một vòng lặp được thiết kế để giúp các bạn tránh khỏi những lỗi ngớ ngẫn như vậy trong quá trình phát triển phần mềm.

Sử dụng try-catch? Nhiều bạn chày cối sử dụng try-catch để bắt exception, và chỉ đơn giản xuất ra lỗi rồi thôi. Trên thực tế khi gặp những lỗi này thì bạn nên vào sửa code để chạy cho đúng nhé, chứ try-catch là một điều không nên làm trong những trường hợp như vậy.

Nguồn tham khảo

https://www.geeksforgeeks.org/understanding-array-indexoutofbounds-exception-in-java/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x