Nguyên nhân ArrayIndexOutOfBoundsException
gì?
Nếu bạn nghĩ về một biến là một "hộp" nơi bạn có thể đặt một giá trị, thì một mảng là một chuỗi các hộp được đặt cạnh nhau, trong đó số lượng hộp là một số nguyên hữu hạn và rõ ràng.
Tạo một mảng như thế này:
final int[] myArray = new int[5]
tạo một hàng gồm 5 hộp, mỗi hộp giữ một int
. Mỗi hộp có một chỉ mục, một vị trí trong chuỗi các hộp. Chỉ số này bắt đầu từ 0 và kết thúc tại N-1, trong đó N là kích thước của mảng (số lượng hộp).
Để lấy một trong các giá trị từ loạt hộp này, bạn có thể tham khảo nó thông qua chỉ mục của nó, như sau:
myArray[3]
Nó sẽ cung cấp cho bạn giá trị của hộp thứ 4 trong chuỗi (vì hộp đầu tiên có chỉ số 0).
Một nguyên nhân ArrayIndexOutOfBoundsException
là do cố gắng lấy lại một "hộp" không tồn tại, bằng cách vượt qua một chỉ số cao hơn chỉ số của "hộp" cuối cùng hoặc âm.
Với ví dụ đang chạy của tôi, các đoạn mã này sẽ tạo ra một ngoại lệ như vậy:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Làm sao để tránh ArrayIndexOutOfBoundsException
Để ngăn chặn ArrayIndexOutOfBoundsException
, có một số điểm chính cần xem xét:
Vòng lặp
Khi lặp qua một mảng, luôn đảm bảo rằng chỉ mục bạn đang truy xuất nhỏ hơn hoàn toàn so với chiều dài của mảng (số lượng hộp). Ví dụ:
for (int i = 0; i < myArray.length; i++) {
Lưu ý rằng <
, không bao giờ trộn một =
trong đó ..
Bạn có thể muốn được cám dỗ để làm một cái gì đó như thế này:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Chỉ không. Bám sát cái ở trên (nếu bạn cần sử dụng chỉ số) và nó sẽ giúp bạn tiết kiệm rất nhiều nỗi đau.
Nếu có thể, hãy sử dụng foreach:
for (int value : myArray) {
Bằng cách này, bạn sẽ không phải suy nghĩ về các chỉ số.
Khi lặp, bất cứ điều gì bạn làm, KHÔNG BAO GIỜ thay đổi giá trị của trình vòng lặp (ở đây i
:). Nơi duy nhất này nên thay đổi giá trị là giữ cho vòng lặp tiếp tục. Thay đổi nó chỉ là rủi ro ngoại lệ, và trong hầu hết các trường hợp không phải là cần thiết.
Truy xuất / cập nhật
Khi lấy một phần tử tùy ý của mảng, luôn kiểm tra xem đó có phải là một chỉ mục hợp lệ so với độ dài của mảng không:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}