Sebebi nedir ArrayIndexOutOfBoundsException
?
Bir değişkeni bir değer yerleştirebileceğiniz bir "kutu" olarak düşünüyorsanız, dizi birbirinin yanında yer alan bir dizi kutucuktur, burada kutu sayısı sonlu ve açık bir tamsayıdır.
Bunun gibi bir dizi oluşturma:
final int[] myArray = new int[5]
her biri bir int
. Kutuların her biri bir dizin, kutu serisindeki bir konuma sahiptir. Bu dizin 0 ile başlar ve N-1 ile biter, burada N dizinin büyüklüğüdür (kutu sayısı).
Bu kutu serisindeki değerlerden birini almak için, aşağıdaki gibi dizininden başvurabilirsiniz:
myArray[3]
Bu size serideki 4. kutunun değerini verecektir (ilk kutunun dizini 0 olduğundan).
Bunun ArrayIndexOutOfBoundsException
nedeni, var olmayan bir "kutuyu" kurtarmaya çalışmaktır, son "kutu" dizininden daha yüksek veya negatif olan bir dizin iletmektir.
Çalışan örneğimde, bu kod parçacıkları böyle bir istisna oluşturur:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Nasıl önlenir ArrayIndexOutOfBoundsException
Önlemek ArrayIndexOutOfBoundsException
için dikkate alınması gereken bazı önemli noktalar vardır:
Döngü
Bir dizi arasında döngü yaparken, her zaman almakta olduğunuz dizinin dizinin uzunluğundan (kutu sayısından) kesinlikle daha küçük olduğundan emin olun. Örneğin:
for (int i = 0; i < myArray.length; i++) {
Dikkat edin <
, =
orada asla karıştırmayın ..
Bunun gibi bir şey yapmaya cazip gelmek isteyebilirsiniz:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Sadece yapma. Yukarıdakine sadık kalın (endeksi kullanmanız gerekiyorsa) ve bu size çok fazla acı kazandıracaktır.
Mümkünse, foreach kullanın:
for (int value : myArray) {
Bu şekilde indeksleri düşünmek zorunda kalmayacaksınız.
Döngü yaparken, ne yaparsanız yapın, ASLA döngü yineleyicinin değerini değiştirmeyin (burada:) i
. Bunun değer değiştirmesi gereken tek yer, döngüyü devam ettirmektir. Aksi takdirde sadece istisna riski vardır ve çoğu durumda gerekli değildir.
Alma / güncelleme
Dizinin isteğe bağlı bir öğesini alırken, dizinin uzunluğuna göre her zaman geçerli bir dizin olup olmadığını kontrol edin:
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];
}