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

Java "java.lang.ArrayIndexOutOfBoundsException" Hatası Nasıl Çözülür?

java-arrayindexoutofboundsexception-hatasi-nasil-cozulur-2
Bu yazıda neler var?
  1. java.lang.ArrayIndexOutOfBoundsException neden oluşur?
  2. length ile son geçerli indeks arasındaki farkı tabloyla gör
  3. Hatalı erişim satırı nasıl teşhis edilir?
  4. Döngü, kullanıcı girdisi ve iç içe dizilerde sınır nasıl korunur?
  5. Üç kısa Java örneğiyle hatayı üret ve düzelt
  6. Sık Sorulan Sorular

Java java.lang.ArrayIndexOutOfBoundsException hatası, bir dizide bulunmayan bir indekse erişilmeye çalışıldığında oluşur. İndeks negatifse ya da dizi.length değerine eşit veya daha büyükse erişim sınır dışıdır. Çözüm için erişimden önce 0 <= indeks && indeks < dizi.length koşulunun sağlandığını kontrol etmek gerekir.

İndeksleme Java dizilerinde sıfırdan başlar. Bu nedenle hata genellikle döngü sınırının yanlış kurulması, kullanıcıdan alınan indeksin doğrulanmaması veya iç içe dizilerde yanlış dizinin uzunluğunun kullanılması sonucunda ortaya çıkar. Hatanın kaynağını bulmak için stack trace içindeki dosya ve satır bilgisi incelenerek sınır dışı erişim yapan ifade belirlenir.

java.lang.ArrayIndexOutOfBoundsException neden oluşur?

Java'da bir dizi oluşturulduğunda her elemanın bir indeks değeri olur. İlk elemanın indeksi 0 değeridir. Dizinin eleman sayısını gösteren length değeri ise geçerli indekslerin sonuncusu değildir. Son geçerli indeks, her zaman length - 1 olarak hesaplanır.

Örneğin beş elemanlı bir dizide 0, 1, 2, 3 ve 4 indeksleri kullanılabilir. dizi[5] ifadesi ise dizinin eleman sayısı beş olduğu için sınır dışıdır. Aynı şekilde dizi[-1] ifadesi de geçersizdir, çünkü Java dizilerinde negatif indeks bulunmaz.

Bu hata, dizinin tanımlandığı anda değil, erişim ifadesi çalıştırılırken oluşur. Örneğin bir dizi doğru biçimde oluşturulmuş olsa bile, hesaplanan indeks geçerli aralığın dışına çıkarsa Java çalışma zamanında java.lang.ArrayIndexOutOfBoundsException üretir. Bu nedenle yalnızca dizi tanımını değil, diziye erişen her ifadeyi ve indeksi üreten hesabı incelemek gerekir.

İlk teşhis adımı stack trace'i okumaktır. Hata mesajında kendi Java dosyanın adı ve satır numarası bulunur. İlgili satırda dizi[indeks], dizi[i] veya benzeri bir erişim varsa indeksin o anda hangi değeri aldığını kontrol et. Döngü kullanılıyorsa başlangıç ve bitiş koşullarını, kullanıcı girdisi varsa negatif ve fazla büyük değerleri, iç içe dizilerde ise her boyutun kendi uzunluğunu ayrı ayrı değerlendir.

length ile son geçerli indeks arasındaki farkı tabloyla gör

length ile son geçerli indeks arasındaki farkı tabloyla gör

Bir dizinin length değeri, dizide kaç eleman bulunduğunu gösterir. İndeksler sıfırdan başladığı için son geçerli indeks bu değerden bir eksiktir. Başka bir ifadeyle geçerli aralık, 0 ile length - 1 arasındadır.

length değeri Son geçerli indeks Hatalı erişim örneği
5 4 dizi[5]
3 2 dizi[3]
0 Geçerli indeks bulunmaz dizi[0]
Bir dizinin uzunluğu 5 ise geçerli indeksler 0 ile 4 arasındadır; 5. indekse erişmek sınır dışıdır.

Bu farkı kısa sorularla pekiştirmek için Java bilgi testini çözerek indeksleme konusundaki bilgini kontrol edebilirsin.

Hatalı erişim satırı nasıl teşhis edilir?

Hatalı erişim satırı nasıl teşhis edilir?

Bu hatayı çözmek için yalnızca java.lang.ArrayIndexOutOfBoundsException adını okumak yeterli değildir. Erişimin yapıldığı satırda kullanılan gerçek indeks, o anda erişilen dizinin length değeri ve indeksin nasıl üretildiği birlikte incelenmelidir.

  1. Stack trace içindeki dosya ve satırı bul. Hata çıktısında kendi Java dosyanın adını ve satır numarasını ara. Birden fazla çağrı satırı görünüyorsa, önce uygulamana ait satırı incele. Hatanın gerçekten hangi dizi[indeks] erişiminde oluştuğunu belirlemek, sonraki kontrollerin doğru noktaya uygulanmasını sağlar.
  2. Erişilen gerçek indeks değerini belirle. Köşeli parantez içinde doğrudan bir sayı mı, yoksa bir değişken mi kullanıldığını kontrol et. dizi[indeks] ifadesinde sorun çoğu zaman indeks değişkeninin beklenenden farklı bir değer almasıdır. İndeks bir hesaplamadan geliyorsa, hesaplamanın her adımındaki değeri ayrı ayrı incele.
  3. Aynı anda dizinin length değerini kontrol et. Erişim anındaki indeks ile erişilen dizinin o anki uzunluğunu karşılaştır. Yalnızca hata mesajındaki sayıya bakmak, hangi dizinin kullanıldığını ve o dizinin kaç eleman içerdiğini göstermeyebilir. Aynı indeks, farklı uzunluktaki dizilerde farklı sonuçlar doğurabilir.
  4. İndeksin nereden üretildiğini geriye doğru izle. Değer bir for döngüsünden, kullanıcı girdisinden veya başka bir değişkenin hesabından geliyor olabilir. Özellikle bir değerden 1 çıkarılması, döngü sınırının yanlış kurulması ya da kullanıcıdan gelen değerin doğrudan kullanılması sınır hatasına yol açabilir.
  5. Sınır değerlerini ayrı ayrı dene. -1 her zaman geçersizdir. Dizi boş değilse 0 ilk, length - 1 son geçerli konumu temsil eder. length ise bir sonraki konumu gösterir ve diziye erişimde geçersizdir. Dizi boşsa 0 ve length - 1 değerleri de güvenli bir erişim sağlamaz.

Bu sırayı izlemek, hatanın yalnızca hangi satırda göründüğünü değil, neden o değerin üretildiğini de ortaya çıkarır. Böylece düzeltme, erişim satırına rastgele bir koşul eklemek yerine indeksin kaynağına uygulanabilir.

Döngü, kullanıcı girdisi ve iç içe dizilerde sınır nasıl korunur?

Dizi sınırlarını korumanın temelinde, erişimden önce indeksin o dizi için geçerli olup olmadığını kontrol etmek bulunur. Kontrolün biçimi, indeksin bir döngüden mi, kullanıcıdan mı yoksa başka bir diziden mi geldiğine göre değişebilir.

for döngülerinde genellikle i < dizi.length koşulu kullanılır. Bu koşul, indeks length değerine ulaşmadan döngüyü durdurur. i <= dizi.length kullanıldığında ise i değeri length olduğunda bir erişim daha denenir ve son konumun dışına çıkılır. İndeksin hem negatif hem de fazla büyük olabileceği durumlarda i >= 0 && i < dizi.length mantığı güvenli bir sınır kontrolü sağlar.

Kullanıcıdan alınan indekslerde değer diziye erişilmeden önce 0 <= indeks && indeks < dizi.length koşuluyla doğrulanmalıdır. Koşul sağlanmıyorsa anlaşılır bir hata mesajı gösterilebilir veya kullanıcıdan yeniden giriş yapması istenebilir. Geçersiz değer doğrudan dizi[indeks] ifadesinde kullanılırsa hata kaçınılmaz hâle gelebilir.

İç içe dizilerde satır ve sütun ayrı ayrı denetlenir. Önce satırın matris.length değeriyle geçerli olup olmadığı kontrol edilir. Bu kontrol tamamlanmadan matris[satir].length ifadesi değerlendirilmemelidir; çünkü satır indeksi zaten geçersizse satırın uzunluğunu okumaya çalışmak da aynı hatayı oluşturur. Satır geçerliyse, sütun için seçilen satırın kendi length değeri kullanılır. Böylece farklı uzunluklara sahip iç dizilerde de sınır kontrolü doğru yapılır.

Üç kısa Java örneğiyle hatayı üret ve düzelt

1. Son elemanı almak için length değerini kullanmak

Hatalı kod:

public class PuanOrnegi {
    public static void main(String[] args) {
        int[] puanlar = {70, 80, 90};
        System.out.println(puanlar[puanlar.length]);
    }
}

Veri: puanlar dizisinde üç eleman vardır. puanlar.length değeri 3'tür.

Beklenen hata davranışı: puanlar[3] erişimi, son geçerli indeks 2 olduğu için java.lang.ArrayIndexOutOfBoundsException oluşturur.

Düzeltilmiş kod:

public class PuanOrnegi {
    public static void main(String[] args) {
        int[] puanlar = {70, 80, 90};
        System.out.println(puanlar[puanlar.length - 1]);
    }
}

Beklenen çıktı: 90.

2. for döngüsünde <= kullanmak

Hatalı kod:

public class DonguOrnegi {
    public static void main(String[] args) {
        int[] sayilar = {10, 20, 30};

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

Veri: sayilar = {10, 20, 30}. Döngü sınırı, dizinin uzunluğuna eşit olmayı da kabul eder.

Beklenen hata davranışı: Program 10, 20 ve 30 değerlerini yazdırır. i değeri 3 olduğunda geçersiz erişim yapılır ve istisna oluşur.

Düzeltilmiş kod:

public class DonguOrnegi {
    public static void main(String[] args) {
        int[] sayilar = {10, 20, 30};

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

Beklenen çıktı: 10, 20 ve 30 ayrı satırlarda yazdırılır, program hata vermeden sona erer.

3. İç içe dizide sütun sınırını yanlış kontrol etmek

Hatalı kod:

import java.util.Scanner;

public class TabloOrnegi {
    public static void main(String[] args) {
        int[][] tablo = {{10, 20}, {30, 40, 50}};
        Scanner scanner = new Scanner(System.in);

        int satir = scanner.nextInt();
        int sutun = scanner.nextInt();

        System.out.println(tablo[satir][sutun]);
        scanner.close();
    }
}

Örnek girdi: 1 3. İkinci satırın uzunluğu 3 olsa da geçerli sütun indeksleri 0, 1 ve 2'dir.

Beklenen hata davranışı: tablo[1][3] erişimi java.lang.ArrayIndexOutOfBoundsException oluşturur.

Düzeltilmiş kod: Önce satır, ardından seçilen satırın kendi uzunluğu üzerinden sütun denetlenir.

import java.util.Scanner;

public class TabloOrnegi {
    public static void main(String[] args) {
        int[][] tablo = {{10, 20}, {30, 40, 50}};
        Scanner scanner = new Scanner(System.in);

        int satir = scanner.nextInt();
        int sutun = scanner.nextInt();

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

        scanner.close();
    }
}

Beklenen çıktı: 1 3 girdisi için Geçersiz indeks, 1 2 girdisi için 50.

Benzer hata ayıklama çalışmalarını kişiye özel ödev ve müfredatla sürdürmek isteyenler, Berk Akademi Java Özel Ders programı hakkında bilgi alabilir.

Sık Sorulan Sorular

Boş bir Java dizisinde neden geçerli indeks bulunmaz?

Uzunluğu 0 olan dizide hiç eleman yoktur. Bu nedenle geçerli bir indeks bulunmaz ve dizi[0] erişimi bile java.lang.ArrayIndexOutOfBoundsException oluşturur.

Kullanıcı 1'den başlayan bir seçim yaptığında bunu Java indeksine nasıl çevirmek gerekir?

Java dizileri 0'dan başladığı için seçim değerinden 1 çıkarılır: int indeks = secim - 1;. Erişimden önce seçimin 1 ile dizi.length arasında olduğu kontrol edilmelidir.

İç içe dizilerde her satırın uzunluğu farklı olabilir mi?

Evet. int[][] yapısında her satır ayrı bir dizi olabilir ve uzunlukları farklı olabilir. Bu nedenle sütun kontrolü tablo[satir].length üzerinden yapılmalıdır.

İndeks sınırını her erişimden önce kontrol etmek, bu hatayı teşhis edip düzeltmenin temel adımıdır.

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