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 ArrayIndexOutOfBoundsExceptionnedeni, 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 ArrayIndexOutOfBoundsExceptioniç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];
}