Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java ArrayIndexOutOfBoundsException Hatası Nasıl Çözülür?

java-arrayindexoutofboundsexception-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. ArrayIndexOutOfBoundsException Nedir? Dizi İndeksleri Nasıl Çalışır?
  2. Hata Mesajındaki İndeks ve Dizi Uzunluğu Nasıl Okunur?
  3. Bu Hatanın Yaygın Nedenleri ve Kod Örnekleri
  4. İstisnayı Yakalamak Yerine Hatanın Kaynağı Nasıl Düzeltilir?
  5. Dizi Yerine ArrayList Ne Zaman Tercih Edilebilir?
  6. Sık Sorulan Sorular

Java ArrayIndexOutOfBoundsException hatası, bir dizide bulunmayan indeks numarasına erişilmeye çalışıldığında oluşur. Çözüm için genellikle geniş bir try-catch bloğu eklemek yerine kullanılan indeks, dizinin length değeri ve döngünün sınırı kontrol edilmelidir.

Java dizilerinde indeksler 0’dan başlar. Bu nedenle üç elemanlı bir dizinin geçerli indeksleri 0, 1 ve 2’dir; 3 numaralı indeks geçerli değildir. Aşağıdaki iki bölümü karşılaştırarak hatanın nasıl oluştuğunu ve nasıl önlenebileceğini görebilirsin.

ArrayIndexOutOfBoundsException Nedir? Dizi İndeksleri Nasıl Çalışır?

ArrayIndexOutOfBoundsException, dizinin geçerli indeks aralığının dışındaki bir elemana erişmeye çalıştığında oluşan bir çalışma zamanı istisnasıdır. Bir dizinin eleman sayısını length özelliği verir. Ancak length değeri son indeks değildir; son geçerli indeks her zaman length - 1 olur.

Örneğin numbers dizisinde üç eleman varsa indeksler şöyle çalışır:

int[] numbers = {10, 20, 30};

numbers[0] // 10
numbers[1] // 20
numbers[2] // 30

Bu dizinin numbers.length değeri 3’tür. Buna karşın numbers[3] ifadesi geçersizdir, çünkü 3 numaralı indeks dizide bulunmaz.

Hatalı kod Doğru kod Neden
for (int i = 0; i <= 3; i++) for (int i = 0; i < numbers.length; i++) Üç elemanlı dizide geçerli son indeks 2’dir. i <= 3 koşulu 3 değerini de üretir.
numbers[3] numbers[2] length 3 olsa da son geçerli indeks length - 1, yani 2’dir.

Örneğin aşağıdaki döngü, i değeri 3 olduğunda hataya neden olur:

int[] numbers = {10, 20, 30};

for (int i = 0; i <= 3; i++) {
    System.out.println(numbers[i]);
}

Döngünün doğru biçimi ise şöyledir:

int[] numbers = {10, 20, 30};

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

Doğru kodun beklenen konsol çıktısı:

10
20
30

Buradaki temel kural şudur: İndeks 0’dan başlamalı ve length değerine ulaşmadan durmalıdır. Java dizilerinde güvenli bir döngü yazmak için çoğu durumda i < numbers.length koşulu kullanılmalıdır. İndeks mantığını kısa alıştırmalarla pekiştirmek istersen Java bilgi testlerini çözerek hangi konularda tekrar yapman gerektiğini görebilirsin.

Hata Mesajındaki İndeks ve Dizi Uzunluğu Nasıl Okunur?

Hata Mesajındaki İndeks ve Dizi Uzunluğu Nasıl Okunur?

Hata mesajı, çoğu zaman erişilmeye çalışılan indeks ile dizinin uzunluğu hakkında önemli ipuçları verir. Örneğin bir çalışma ortamında şu biçime benzer bir mesaj görebilirsin:

ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

Bu örnekte program 3 numaralı indekse erişmeye çalışmıştır. Dizinin uzunluğu ise 3’tür. Geçerli indeksler 0, 1 ve 2 olduğundan 3 numaralı indeks sınırın dışındadır. Mesajın yazım biçimi Java sürümüne veya çalışma ortamına göre değişebilir; bu nedenle metni ezberlemek yerine iki bilgiyi ayırmaya odaklanmalısın:

  • Erişilmeye çalışılan indeks: Programın kullanmak istediği konumdur.
  • Dizinin uzunluğu: Dizide kaç eleman bulunduğunu gösteren length değeridir.

İndeks neden length değerine eşit veya ondan büyük olabilir? Bunun yaygın nedeni, son geçerli indeks ile eleman sayısının karıştırılmasıdır. Örneğin length değeri 5 olan bir dizide geçerli indeksler 0’dan 4’e kadardır. Döngü i <= dizi.length şeklinde yazılırsa i değeri 5 olduğunda geçersiz erişim yapılır.

Stack trace incelerken şu sırayı izleyebilirsin:

  1. Önce hata sınıfının adını bul: ArrayIndexOutOfBoundsException.
  2. Ardından kendi koduna ait dosya adını ve satır numarasını ara.
  3. Belirtilen satırda hangi diziye erişildiğini belirle.
  4. Köşeli parantez içindeki indeks ifadesini incele; örneğin numbers[i].
  5. i değerinin o anda kaç olduğunu ve dizinin length değerini kontrol et.

İncelemeye stack trace’te gösterilen kendi dosyanın satırından başlamak, hatanın kaynağını hızlıca daraltır. Özellikle döngü koşulunda <= kullanılıp kullanılmadığını ve indeksin başka bir işlem sonucunda artırılıp artırılmadığını kontrol et.

Bu Hatanın Yaygın Nedenleri ve Kod Örnekleri

Bu Hatanın Yaygın Nedenleri ve Kod Örnekleri

ArrayIndexOutOfBoundsException çoğunlukla dizinin sınırları dışında bir elemana erişilmeye çalışıldığında oluşur. Java dizilerinde geçerli indeksler her zaman 0 ile length - 1 arasındadır.

1. Geçersiz indeks kullanımı

Aşağıdaki dizinin uzunluğu 3 olduğu için geçerli indeksleri 0, 1 ve 2'dir. 3 numaralı indeks yoktur.

int[] sayilar = {10, 20, 30};

System.out.println(sayilar[3]);

Hata, ikinci satırda oluşur. Program beklenen değeri yazdırmak yerine ArrayIndexOutOfBoundsException üretir. Düzeltme, geçerli bir indeks kullanmaktır:

int[] sayilar = {10, 20, 30};

System.out.println(sayilar[2]);

Beklenen konsol çıktısı:

30

2. Boş dizide elemana erişmeye çalışma

Boş bir dizinin length değeri 0'dır. Bu nedenle bu dizide geçerli bir indeks bulunmaz; 0 bile geçersizdir.

int[] sayilar = new int[0];

System.out.println(sayilar[0]);

Hata, sayilar[0] ifadesinin bulunduğu satırda oluşur. Erişimden önce dizinin boş olup olmadığı kontrol edilmelidir:

if (sayilar.length > 0) {
    System.out.println(sayilar[0]);
} else {
    System.out.println("Dizi boş.");
}

Beklenen çıktı Dizi boş. olur. Boş dizi olasılığını gözden kaçırmamak, özellikle veriler dışarıdan geldiğinde önemlidir.

3. Kullanıcıdan alınan geçersiz indeks

Kullanıcıdan alınan bir sayı, doğrudan dizi indeksi olarak kullanılmamalıdır. Önce bu sayının sınırlar içinde olup olmadığı doğrulanmalıdır.

int[] notlar = {70, 80, 90};
int indeks = 3;

// Hatalı: Sınır kontrolü yapılmadan erişiliyor.
System.out.println(notlar[indeks]);

Daha güvenli yaklaşım şöyledir:

if (indeks >= 0 && indeks < notlar.length) {
    System.out.println(notlar[indeks]);
} else {
    System.out.println("Geçersiz indeks.");
}

indeks değeri 3 olduğunda beklenen çıktı Geçersiz indeks. olur. Kontrolde üst sınırın length değil, length - 1 olduğunu unutma.

4. Döngü sınırında <= kullanılması

Dizinin son indeksine kadar ilerlemek için döngü koşulunda genellikle < kullanılmalıdır:

int[] sayilar = {10, 20, 30};

for (int i = 0; i <= sayilar.length; i++) {
    System.out.println(sayilar[i]);
}

Bu kodda i değerleri 0, 1, 2 ve 3 olur. Hata, i değeri 3 olduğunda oluşur. Çünkü dizinin uzunluğu 3, son geçerli indeksi ise 2'dir. Doğru kullanım:

for (int i = 0; i < sayilar.length; i++) {
    System.out.println(sayilar[i]);
}

Beklenen çıktı sırasıyla 10, 20 ve 30 değerleridir. Geniş bir try-catch bloğuyla bu hatayı yakalamak sorunu çözmez; hatalı indeks veya döngü sınırı düzeltilmelidir.

İstisnayı Yakalamak Yerine Hatanın Kaynağı Nasıl Düzeltilir?

Bu istisnayı doğru çözmek için aşağıdaki teşhis akışını izle:

  1. Stack trace satırını bul: Hatanın oluştuğu sınıfı ve satır numarasını belirle.
  2. Dizinin uzunluğunu kontrol et: İlgili noktada array.length değerini incele.
  3. İndeksi geriye doğru izle: İndeks sabit mi, döngüden mi, kullanıcı girdisinden mi geliyor?
  4. Sınırı incele: Döngüde <= yerine < gerekip gerekmediğine bak.
  5. Sınır durumlarını test et: İlk indeks, son indeks, negatif değer ve boş diziyle deneme yap.
  6. Dar kapsamlı hata yönetimi kullan: Yalnızca gerçekten beklenmeyen ve yönetilmesi gereken durumlarda ilgili satıra yakın bir hata yönetimi ekle.

Hata kaynağını gizleyen yaklaşım, erişimi geniş bir try-catch içine alıp programın devam etmesine güvenmektir. Bu durumda yanlış veri sessizce atlanabilir. Kaynağı düzelten yaklaşım ise erişimden önce sınırı kontrol eder:

if (indeks >= 0 && indeks < dizi.length) {
    System.out.println(dizi[indeks]);
}

Her dizi erişiminde şu kontrol listesini kullan: İndeks nereden geliyor? Alt sınır 0 mı? Üst sınır length - 1 mi? Dizi boş olabilir mi? Döngü bir kez fazla çalışıyor mu? Kullanıcı girdisi doğrulandı mı?

Dizi Yerine ArrayList Ne Zaman Tercih Edilebilir?

Diziler, eleman sayısının baştan belli olduğu durumlarda sade ve uygun bir seçenektir. Örneğin haftanın yedi gününü, sabit sayıdaki sınav sonucunu veya koordinat değerlerini saklayacaksan dizi boyutunun çalışma sırasında değişmesine ihtiyaç duymayabilirsin.

Eleman sayısının önceden bilinmediği ya da program çalışırken değişebildiği durumlarda ise ArrayList daha esnek olabilir. Yeni eleman eklemek veya mevcut bir elemanı kaldırmak için koleksiyonun boyutunu elle yeniden oluşturman gerekmez.

ArrayList<String> isimler = new ArrayList<>();

isimler.add("Ece");
isimler.add("Mert");
isimler.add("Deniz");

System.out.println(isimler.get(2));

Bu kodun beklenen konsol çıktısı şöyledir:

Deniz

Ancak ArrayList kullanmak indeks hatalarını tamamen ortadan kaldırmaz. Örnekte üç eleman bulunduğu için geçerli indeksler 0, 1 ve 2 değerleridir. isimler.get(3) çağrısı yine indeks sınırının aşılmasına neden olur. Bu nedenle dizi kullanırken length, ArrayList kullanırken ise size() değeri dikkate alınmalıdır.

  • Eleman sayısı sabitse ve doğrudan indeks erişimi yeterliyse dizi tercih edilebilir.
  • Eleman sayısı çalışma sırasında artacak veya azalacaksa ArrayList daha esnek olabilir.
  • Her iki yapıda da indekslerin sıfırdan başladığı unutulmamalıdır.
  • İndeksin alt sınırı 0, üst sınırı ise eleman sayısından bir eksiktir.

Java’da indeks sınırlarını, döngüleri ve hata mesajlarını yapılandırılmış çalışmalarla pekiştirmek istersen birebir Java özel ders programını inceleyebilirsin.

Sık Sorulan Sorular

ArrayIndexOutOfBoundsException ile IndexOutOfBoundsException arasındaki fark nedir?

IndexOutOfBoundsException, geçersiz indeks erişimlerini temsil eden daha genel bir istisna türüdür. ArrayIndexOutOfBoundsException ise özellikle Java dizilerinde sınırların dışına çıkıldığında oluşur ve bu genel istisna türünün alt sınıfıdır. ArrayList gibi koleksiyonlarda geçersiz indeks erişimi genellikle IndexOutOfBoundsException ile bildirilir.

Dizi boşsa neden hiçbir indeks geçerli olmaz?

Boş bir dizinin uzunluğu 0 olduğu için içinde erişilebilecek bir eleman bulunmaz. Son geçerli indeks, uzunluğun bir eksiği olarak hesaplandığından boş dizi için bu değer -1 olur. İndeksler negatif olamayacağı için 0 dâhil hiçbir indeks geçerli değildir.

ArrayIndexOutOfBoundsException hatasını try-catch ile yakalamak doğru bir çözüm müdür?

Çoğu durumda hayır. Geniş bir try-catch bloğu hatalı indeks hesabını gizleyebilir ancak sorunun kaynağını düzeltmez. Öncelikle kullanılan indeksi, dizinin length değerini ve döngü koşulunu kontrol etmelisin. İstisna yakalama, geçersiz erişimi normal program akışı hâline getirmek için kullanılmamalıdır.

Java dizisinde son elemana güvenli şekilde nasıl erişilir?

Önce dizinin boş olmadığını kontrol et, ardından dizi[dizi.length - 1] ifadesini kullan. Örneğin if (dizi.length > 0) koşulu sağlandıktan sonra son elemana erişmek güvenlidir. Bu kontrol, boş dizide -1 indeksinin kullanılmasını önler.

Kısacası kalıcı çözüm, istisnayı bastırmak değil; indeksi eleman sayısıyla karşılaştırmak, döngü sınırını doğru kurmak ve hata mesajındaki satırı dikkatle incelemektir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara