Apa ArrayIndexOutOfBoundsException
maksudnya dan bagaimana cara menghilangkannya?
Berikut adalah contoh kode yang memicu pengecualian:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
i <= name.length
dengani < name.length
- atau lebih baik, tuliskan pengulangan untuk loop. (for (String aName : name) { ... }
)Jawaban:
Pelabuhan panggilan pertama Anda harus berupa dokumentasi yang menjelaskannya dengan cukup jelas:
Jadi misalnya:
Adapun cara menghindarinya ... um, jangan lakukan itu. Hati-hati dengan indeks array Anda.
Satu masalah yang terkadang ditemui orang adalah berpikir bahwa array adalah 1-diindeks, misalnya
Itu akan kehilangan elemen pertama (indeks 0) dan melemparkan pengecualian ketika indeks 5. Indeks yang valid di sini adalah 0-4 inklusif.
for
Pernyataan idiomatik yang benar di sini adalah:(Itu dengan asumsi Anda memerlukan indeks, tentu saja. Jika Anda dapat menggunakan yang ditingkatkan untuk loop, lakukanlah.)
sumber
for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }
.Lihat juga:
Perbarui : sesuai cuplikan kode Anda,
Indeks ini termasuk panjang array. Ini di luar batas. Anda harus mengganti
<=
dengan<
.sumber
Dari artikel yang bagus ini: ArrayIndexOutOfBoundsException in for loop
Singkatnya:
Dalam iterasi terakhir
i
akan sama denganname.length
yang merupakan indeks ilegal, karena indeks array berbasis nol.Kode Anda harus dibaca
sumber
Ini berarti bahwa Anda mencoba mengakses indeks array yang tidak valid karena tidak berada di antara batas.
Misalnya ini akan menginisialisasi array integer primitif dengan batas atas 4.
Programmer dihitung dari nol. Jadi ini misalnya akan melempar
ArrayIndexOutOfBoundsException
karena batas atas adalah 4 dan bukan 5.sumber
Untuk menghindari pengecualian indeks array di luar batas, seseorang harus menggunakan pernyataan yang ditingkatkan di
for
mana dan kapan mereka bisa.Motivasi utama (dan use case) adalah ketika Anda melakukan iterasi dan Anda tidak memerlukan langkah iterasi yang rumit. Anda tidak akan bisa menggunakan yang disempurnakan
for
untuk bergerak mundur dalam array atau hanya mengulangi pada setiap elemen lainnya.Anda dijamin tidak kehabisan elemen untuk beralih saat melakukan ini, dan contoh [yang diperbaiki] Anda mudah dikonversi.
Kode di bawah ini:
... sama dengan ini:
sumber
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:
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:
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:
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:
Perhatikan
<
, jangan pernah campur=
di sana ..Anda mungkin ingin tergoda untuk melakukan sesuatu seperti ini:
Hanya saja, jangan. Tetap pada yang di atas (jika Anda perlu menggunakan indeks) dan itu akan menghemat banyak rasa sakit.
Jika memungkinkan, gunakan foreach:
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:
sumber
Dalam kode Anda, Anda telah mengakses elemen dari indeks 0 hingga panjang array string.
name.length
memberikan jumlah objek string dalam array Anda objek string yaitu 3, tetapi Anda hanya dapat mengakses hingga indeks 2name[2]
, karena array dapat diakses dari indeks 0 kename.length - 1
tempat Anda mendapatkanname.length
jumlah objek.Bahkan saat menggunakan
for
loop Anda sudah mulai dengan indeks nol dan Anda harus mengakhiri denganname.length - 1
. Dalam array a [n] Anda dapat mengakses form [0] ke [n-1].Sebagai contoh:
Dalam kasus Anda:
sumber
Untuk larik yang Anda berikan, panjang larik adalah 3 (yaitu name.length = 3). Tetapi karena ia menyimpan elemen mulai dari indeks 0, ia memiliki indeks max 2.
Jadi, alih-alih 'i ** <= name.length' Anda harus menulis 'i <** name.length' untuk menghindari 'ArrayIndexOutOfBoundsException'.
sumber
Begitu banyak untuk pertanyaan sederhana ini, tetapi saya hanya ingin menyoroti fitur baru di Jawa yang akan menghindari semua kebingungan seputar pengindeksan dalam array bahkan untuk pemula. Java-8 telah mengabstraksi tugas iterasi untuk Anda.
Apa untungnya? Nah, satu hal adalah keterbacaan seperti bahasa Inggris. Kedua, Anda tidak perlu khawatir tentang
ArrayIndexOutOfBoundsException
sumber
Anda mendapatkan
ArrayIndexOutOfBoundsException
karenai<=name.length
sebagian.name.length
mengembalikan panjang stringname
, yaitu 3. Karenanya ketika Anda mencoba mengaksesname[3]
, itu ilegal dan melempar pengecualian.Kode yang diselesaikan:
Ini didefinisikan dalam spesifikasi bahasa Java :
sumber
Begitulah cara jenis pengecualian ini terlihat ketika dilemparkan ke Eclipse. Angka berwarna merah menandakan indeks yang Anda coba akses. Jadi kodenya akan terlihat seperti ini:
Kesalahan terjadi ketika Anda mencoba mengakses indeks yang tidak ada dalam array itu. Jika sebuah array memiliki panjang 3,
maka satu-satunya indeks yang valid adalah:
Jika sebuah array memiliki panjang 1,
maka satu-satunya indeks yang valid adalah:
Bilangan bulat apa pun yang sama dengan panjang array, atau lebih besar dari itu: di luar batas.
Bilangan bulat apa pun yang kurang dari 0: di luar batas;
PS: Jika Anda terlihat memiliki pemahaman yang lebih baik tentang array dan melakukan beberapa latihan praktis, ada video di sini: tutorial tentang array di Jawa
sumber
Untuk array multidimensi, mungkin sulit untuk memastikan Anda mengakses
length
properti dari dimensi yang tepat. Ambil kode berikut sebagai contoh:Setiap dimensi memiliki panjang yang berbeda, sehingga bug halus adalah bahwa loop tengah dan dalam menggunakan
length
properti dari dimensi yang sama (karenaa[i].length
sama dengana[j].length
).Sebagai gantinya, loop dalam harus menggunakan
a[i][j].length
(ataua[0][0].length
, untuk kesederhanaan).sumber
Kasus paling umum yang pernah saya lihat untuk ArrayIndexOutOfBoundsExceptions yang tampaknya misterius, yaitu tampaknya tidak disebabkan oleh kode penanganan array Anda sendiri, adalah penggunaan bersamaan dari SimpleDateFormat. Khususnya dalam servlet atau controller:
Jika dua utas memasukkan metode SimplateDateFormat.parse () bersama-sama, Anda mungkin akan melihat ArrayIndexOutOfBoundsException. Perhatikan bagian sinkronisasi javadoc kelas untuk SimpleDateFormat .
Pastikan tidak ada tempat dalam kode Anda yang mengakses utas kelas yang tidak aman seperti SimpleDateFormat secara bersamaan seperti di servlet atau controller. Periksa semua variabel instan servlet dan pengontrol Anda untuk kemungkinan tersangka.
sumber
ArrayIndexOutOfBoundsException setiap kali pengecualian ini datang itu berarti Anda mencoba menggunakan indeks array yang di luar batasnya atau dalam istilah orang awam Anda meminta lebih dari yang Anda inisialisasi.
Untuk mencegah hal ini selalu pastikan bahwa Anda tidak meminta indeks yang tidak ada dalam array yaitu jika panjang array adalah 10 maka indeks Anda harus berkisar antara 0 hingga 9
sumber
ArrayIndexOutOfBounds berarti Anda mencoba mengindeks posisi dalam array yang tidak dialokasikan.
Pada kasus ini:
Untuk menyiasati ini ...
Di for for loop Anda, Anda bisa melakukan i <name.length. Ini akan mencegah perulangan ke nama [3] dan sebagai gantinya akan berhenti di nama [2]
for(int i = 0; i<name.length; i++)
Gunakan a untuk setiap loop
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
Gunakan list.forEach (Tindakan konsumen) (memerlukan Java8)
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
Konversi array ke streaming - ini adalah opsi yang baik jika Anda ingin melakukan 'operasi' tambahan untuk array Anda mis. Filter, mengubah teks, mengkonversi ke peta dll (memerlukan Java8)
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
sumber
ArrayIndexOutOfBoundsException
berarti bahwa Anda mencoba mengakses indeks array yang tidak ada atau di luar batas array ini. Indeks array mulai dari 0 dan berakhir panjang - 1 .Dalam kasus Anda
ArrayIndexOutOfBoundsException
terjadi ketika Anda mencoba mengakses elemen diindeks name.length yang tidak ada (indeks array berakhir pada panjang -1). hanya mengganti <= dengan <akan menyelesaikan masalah ini.sumber
Untuk setiap array dengan panjang n, elemen array akan memiliki indeks dari 0 hingga n-1.
Jika program Anda mencoba mengakses elemen (atau memori) apa pun yang memiliki indeks larik lebih besar dari n-1, maka Java akan membuang ArrayIndexOutOfBoundsException
Jadi, inilah dua solusi yang bisa kita gunakan dalam suatu program
Mempertahankan hitungan:
Atau pernyataan perulangan lainnya seperti
Cara yang lebih baik digunakan dengan untuk setiap loop, dalam metode ini seorang programmer tidak perlu repot tentang jumlah elemen dalam array.
sumber
Menurut Kode Anda:
Jika Anda memeriksa System.out.print (name.length);
Anda akan mendapatkan 3;
itu berarti panjang nama Anda adalah 3
lingkaran Anda berjalan dari 0 hingga 3 yang seharusnya berjalan "0 hingga 2" atau "1 hingga 3"
Menjawab
sumber
Setiap item dalam array disebut elemen, dan setiap elemen diakses oleh indeks numeriknya. Seperti yang ditunjukkan pada ilustrasi sebelumnya, penomoran dimulai dengan 0 . Elemen ke-9, misalnya, karenanya akan diakses pada indeks 8.
IndexOutOfBoundsException dilemparkan untuk menunjukkan bahwa suatu indeks semacam (seperti untuk array, ke string, atau ke vektor) berada di luar jangkauan.
Setiap array X, dapat diakses dari [0 hingga (X.length - 1)]
sumber
Saya melihat semua jawaban di sini menjelaskan cara bekerja dengan array dan bagaimana cara untuk menghindari pengecualian indeks. Saya pribadi menghindari array di semua biaya. Saya menggunakan kelas Koleksi, yang menghindari semua kekonyolan karena harus berurusan dengan indeks array sepenuhnya. Konstruksi pengulangan berfungsi dengan baik dengan koleksi kode pendukung yang lebih mudah untuk ditulis, dipahami, dan dipelihara.
sumber
Jika Anda menggunakan panjang array untuk mengontrol iterasi loop for , selalu ingat bahwa indeks item pertama dalam array adalah 0 . Jadi indeks elemen terakhir dalam array adalah kurang dari panjang array.
sumber
ArrayIndexOutOfBoundsException
name itu sendiri menjelaskan bahwa Jika Anda mencoba mengakses nilai pada indeks yang berada di luar cakupan ukuran array maka pengecualian semacam itu terjadi.Dalam kasus Anda, Anda bisa menghapus tanda sama dari for for loop Anda.
Opsi yang lebih baik adalah dengan mengulangi array:
sumber
Kesalahan ini terjadi saat menjalankan loop overlimit kali. Mari kita perhatikan contoh sederhana seperti ini,
Pada awalnya, saya telah menginisialisasi array sebagai 'numberArray'. kemudian, beberapa elemen array dicetak menggunakan for loop. Ketika loop menjalankan waktu 'i', cetak elemen (numberArray [i + 1] .. (ketika nilai saya adalah 1, elemen numberArray [i + 1] dicetak.) .. Misalkan, ketika i = (numberArray. length-2), elemen terakhir array dicetak. Ketika nilai 'i' masuk ke (numberArray.length-1), tidak ada nilai untuk dicetak .. Pada titik itu, 'ArrayIndexOutOfBoundsException' terjadi. Saya berharap Anda bisa mendapatkan ide. terima kasih!
sumber
Anda dapat menggunakan Opsional dalam gaya fungsional untuk menghindari
NullPointerException
danArrayIndexOutOfBoundsException
:Keluaran:
sumber
Anda tidak dapat mengulangi atau menyimpan lebih banyak data daripada panjang larik Anda. Dalam hal ini Anda dapat melakukan seperti ini:
Atau ini:
sumber