Apa yang menyebabkan ArrayIndexOutOfBoundsException
?
Jika Anda menganggap variabel sebagai "kotak" di mana Anda dapat menempatkan nilai, maka array adalah serangkaian kotak yang ditempatkan di sebelah satu sama lain, di mana jumlah kotak adalah bilangan bulat terbatas dan eksplisit.
Membuat array seperti ini:
final int[] myArray = new int[5]
menciptakan deretan 5 kotak, masing-masing memegang sebuah int
. Setiap kotak memiliki indeks, posisi dalam serangkaian kotak. Indeks ini dimulai pada 0, dan berakhir pada N-1, di mana N adalah ukuran array (jumlah kotak).
Untuk mengambil salah satu nilai dari seri kotak ini, Anda bisa merujuknya melalui indeksnya, seperti ini:
myArray[3]
Yang akan memberi Anda nilai kotak ke-4 dalam seri (karena kotak pertama memiliki indeks 0).
An ArrayIndexOutOfBoundsException
disebabkan oleh mencoba untuk mengambil kembali "kotak" yang tidak ada, dengan melewati indeks yang lebih tinggi dari indeks "kotak" terakhir, atau negatif.
Dengan contoh saya yang sedang berjalan, cuplikan kode ini akan menghasilkan pengecualian seperti itu:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Bagaimana cara menghindarinya ArrayIndexOutOfBoundsException
Untuk mencegah ArrayIndexOutOfBoundsException
, ada beberapa poin penting untuk dipertimbangkan:
Looping
Saat mengulang melalui array, selalu pastikan bahwa indeks yang Anda ambil benar-benar lebih kecil dari panjang array (jumlah kotak). Misalnya:
for (int i = 0; i < myArray.length; i++) {
Perhatikan <
, jangan pernah campur =
di sana ..
Anda mungkin ingin tergoda untuk melakukan sesuatu seperti ini:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Hanya saja, jangan. Tetap pada yang di atas (jika Anda perlu menggunakan indeks) dan itu akan menghemat banyak rasa sakit.
Jika memungkinkan, gunakan foreach:
for (int value : myArray) {
Dengan cara ini Anda tidak perlu memikirkan indeks sama sekali.
Saat perulangan, apa pun yang Anda lakukan, JANGAN PERNAH mengubah nilai loop iterator (di sini:) i
. Satu-satunya tempat ini harus mengubah nilai adalah untuk menjaga loop tetap berjalan. Mengubahnya dengan cara lain hanya berisiko mengambil pengecualian, dan dalam banyak kasus tidak perlu.
Pengambilan / pembaruan
Ketika mengambil elemen arbitrer dari array, selalu periksa bahwa itu adalah indeks yang valid terhadap panjang array:
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];
}