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

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

java-arraystoreexception-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. ArrayStoreException Hatası Ne Anlama Gelir?
  2. Hatalı Kodu Üç Türü Sırayla Kontrol Ederek Nasıl Teşhis Edersin?
  3. Hata Neden Derleme Aşamasında Değil, Çalışma Zamanında Oluşur?
  4. ArrayStoreException Hatası Nasıl Düzeltilir?
  5. Üç Türü Karşılaştıran Kısa Karar Listesi
  6. Sık Sorulan Sorular

Java java.lang.ArrayStoreException hatasını çözmek için görünür değişken türünü, bellekte oluşturulan gerçek dizi nesnesinin türünü ve diziye yazılan değerin türünü ayrı ayrı incelemelisin. Görünür değişken Object[] olsa bile arka plandaki nesne new String[1] ile oluşturulmuş bir String[] ise, bu diziye Integer gibi uyumsuz bir nesne yazılması çalışma zamanında hataya yol açar.

İlk bakışta sorun atama satırında görünse de asıl neden, referans türü ile gerçek nesne türünün farklı olmasıdır. Düzeltme için önce bu üç türü belirlemek, ardından ya dizi türünü yazılacak değere uygun hâle getirmek ya da atanan değeri dizinin bileşen türüyle uyumlu seçmek gerekir.

ArrayStoreException Hatası Ne Anlama Gelir?

ArrayStoreException, diziye gerçek bileşen türüyle uyumsuz bir nesne yazılmaya çalışıldığını gösterir. Java, diziye yeni bir değer atanırken yalnızca değişkenin görünen türüne bakmaz. Bellekteki gerçek dizi nesnesinin bileşen türünü de kontrol eder.

Örneğin String[] türündeki bir dizi, Java’daki dizi türleri arasındaki ilişki nedeniyle Object[] türünde bir referansla gösterilebilir. Ancak bu işlem, bellekteki nesneyi gerçekten Object[] yapmaz. Nesne hâlâ yalnızca String değerlerini saklayabilen bir String[] nesnesidir.

Bu nedenle Object[] görünümündeki bir referans üzerinden Integer eklenmeye çalışıldığında Java, gerçek dizi türüyle atanan değerin türünü karşılaştırır. String ile Integer uyumlu olmadığı için hata oluşur. Teşhisin başlangıç noktası, görünür değişken türü, gerçek dizi nesnesinin türü ve atanan değer türünü birbirinden ayırmaktır.

Hatalı Kodu Üç Türü Sırayla Kontrol Ederek Nasıl Teşhis Edersin?

Hatalı Kodu Üç Türü Sırayla Kontrol Ederek Nasıl Teşhis Edersin?

Aşağıdaki kod derlenir, fakat atama satırına gelindiğinde çalışma zamanında hata verir:

public class ArrayStoreExample {
    public static void main(String[] args) {
        String[] names = new String[1];
        Object[] values = names;
        values[0] = Integer.valueOf(42);
    }
}

Temsilî istisna çıktısı şöyledir:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at ArrayStoreExample.main(ArrayStoreExample.java:5)

Stack trace içindeki sınıf adı, satır numarası ve diğer ayrıntılar çalışma ortamına göre değişebilir. Teşhis için şu üç adımı sırayla uygula:

  1. Görünür değişken türü: values değişkeni kaynak kodda Object[] olarak tanımlanmıştır. Bu yüzden derleyici, bu referans üzerinden farklı nesne türlerinin atanmasına izin verebilir.
  2. Gerçek dizi nesnesinin türü: values, names üzerinden oluşturulmuştur. new String[1] ifadesi bellekte gerçek bileşen türü String olan bir String[] oluşturur.
  3. Atanan değerin türü: Integer.valueOf(42) ifadesinin ürettiği nesne Integer türündedir. Bu değer, gerçek bileşen türü String olan diziye yazılamaz.

Doğrudan bir String[] değişkenine Integer atamaya çalışsaydın, derleyici bunu çalışma zamanına bırakmadan reddederdi. Object[] görünümü ise atama ifadesinin derlenmesine izin verir, gerçek uyumluluk kontrolünü çalışma zamanına taşır. Dizi ve tür ilişkisini pekiştirmek için Java bilgi testini çözerek benzer tür dönüşümlerini de değerlendirebilirsin.

Hata Neden Derleme Aşamasında Değil, Çalışma Zamanında Oluşur?

Hata Neden Derleme Aşamasında Değil, Çalışma Zamanında Oluşur?

ArrayStoreException, diziye gerçek bileşen türüyle uyumsuz bir nesne yazılmaya çalışıldığını gösterir. String, Object sınıfının alt türüdür. Java'da referans türü dizileri kovaryant olduğu için bir String[] nesnesi Object[] değişkenine atanabilir. Bu atama dizinin gerçek bileşen türünü değiştirmez.

Object[] values = new String[1]; satırından sonra derleyici, values[0] = Integer.valueOf(42); ifadesini values değişkeninin görünür türü üzerinden değerlendirir: Integer bir Object olduğu için atamayı kabul eder. Çalışma anında ise diziye gerçekten yazılacak değer denetlenir. Nesne String[], değer Integer olduğu için atama ArrayStoreException üretir.

Buna karşılık String[] names = new String[1]; names[0] = Integer.valueOf(42); ifadesi derlenmez. Burada değişkenin görünür bileşen türü zaten String olduğundan uyumsuzluk derleme aşamasında saptanır. Farkı iki adımda düşünebilirsin:

  • Derleme aşaması: Atama, değişkenin kodda bildirilen türüne göre kontrol edilir.
  • Çalışma zamanı: Atama, dizi nesnesinin gerçek bileşen türüne göre yeniden kontrol edilir.

ArrayStoreException Hatası Nasıl Düzeltilir?

Yalnızca metin saklıyorsan String[] kullan

Veriler yalnızca metinlerden oluşuyorsa diziyi ve ona erişen değişkeni String[] olarak tanımla. Böylece eklemek istediğin değerin türü kodda açıkça görünür; uyumsuz bir atama da derleme aşamasında fark edilir.

class MetinDizisi {
    public static void main(String[] args) {
        String[] values = new String[1];
        values[0] = "Java";
        System.out.println(values[0]);
    }
}

Beklenen çıktı: Java.

Farklı türler gerekiyorsa uygun bir koleksiyon seç

Metin ve sayı nesnesini gerçekten aynı yapıda tutman gerekiyorsa java.util.List ve java.util.ArrayList kullanabilirsin. List<Object>, örnekteki String ve Integer değerlerini birlikte tutar. Verilerin tek türde olması gerekiyorsa List<String> gibi türü belirli bir koleksiyon, kullanım amacını daha açık anlatır.

import java.util.ArrayList;
import java.util.List;

class KarmaListe {
    public static void main(String[] args) {
        List<Object> values = new ArrayList<>();
        values.add("Java");
        values.add(Integer.valueOf(42));
        System.out.println(values);
    }
}

Beklenen çıktı: [Java, 42]. Yalnızca değişken bildirimini değiştirmek veya türünü bilmediğin bir değere cast uygulamak yerine, önce hangi tür verileri saklayacağını belirleyip veri yapısını buna göre seç.

Dizi türleri, kalıtım ve hata ayıklama konularını örnekler üzerinden birebir çalışmak için Java Özel Ders programını inceleyebilirsin.

Üç Türü Karşılaştıran Kısa Karar Listesi

ArrayStoreException, diziye gerçek bileşen türüyle uyumsuz bir nesne yazılmaya çalışıldığını gösterir. Hatalı Object[] ve String[] örneğini şu sırayla inceleyebilirsin:

  1. Sol taraftaki görünür türü oku: Değişken Object[] dizi olarak tanımlanmışsa derleyici, bu referans üzerinden her nesnenin atanmasına izin verebilir. Ancak bu bilgi, oluşturulan dizinin gerçek türünü tek başına göstermez.
  2. new ifadesini kontrol et: Object[] dizi = new String[2]; satırında gerçek dizi nesnesi String[] türündedir. Object[] yalnızca bu nesneye erişen referansın görünür türüdür.
  3. Atanan değerin gerçek türünü belirle: dizi[0] = 42; ifadesindeki sayı, kutulama sonucunda bir Integer nesnesi olarak diziye yazılmak istenir. Bu değer String değildir.
  4. Uyumluluğu sorgula: Gerçek dizi String[] olduğuna göre her elemanın String ile uyumlu olması gerekir. Integer bu bileşen türüyle uyumlu olmadığı için atama çalışma zamanında başarısız olur.
  5. Veri yapısını amaca göre seç: Yalnızca metin tutulacaksa String[] veya List<String> gibi türü belirli bir yapı kullan. Gerçekten farklı türde nesneleri birlikte tutman gerekiyorsa, tüketen kodun bu türleri nasıl ayırt edeceğini planlayarak uygun bir koleksiyon seç.

ArrayStoreException çözümü rastgele cast eklemek değil, görünür türü, gerçek veri yapısını ve kullanım amacını uyumlu hâle getirmektir.

Sık Sorulan Sorular

Object[] yerine her zaman String[] kullanmak gerekir mi?

Hayır. Verilerin tamamı metinse String[] daha açık ve güvenli bir seçimdir. Farklı türlerde nesneler gerçekten birlikte tutulacaksa Object[] kullanılabilir. Ancak Object[] referansının arkasında gerçekte String[] bulunuyorsa, her nesne bu diziye yazılamaz.

String[] içine Integer yazmak neden doğrudan derleme hatası verirken Object[] üzerinden yazmak çalışma zamanında hata oluşturur?

String[] değişkeninde derleyici hedefin yalnızca String kabul ettiğini görür ve Integer atamasını reddeder. Object[] referansı ise Integer nesnesini tür açısından kabul eder. Çalışma zamanında Java, referansın arkasındaki gerçek nesnenin String[] olduğunu kontrol eder ve uyumsuz atamada ArrayStoreException oluşturur.

Farklı türleri aynı yapıda tutmak için List<Object> ne zaman tercih edilir?

Farklı türleri aynı koleksiyonda tutmak gerçekten gerekiyorsa ve bu nesneleri kullanan kod tür ayrımını bilinçli biçimde yapabiliyorsa List<Object> tercih edilebilir. Ortak bir üst sınıf veya arayüz kullanılabiliyorsa, List<Object> yerine daha belirli bir koleksiyon türü genellikle daha anlaşılır olur.

ArrayStoreException ile ClassCastException arasındaki fark nedir?

ArrayStoreException, uyumsuz bir nesnenin diziye yazılması sırasında oluşur. ClassCastException ise mevcut bir nesnenin gerçekte sahip olmadığı bir türe dönüştürülmek istenmesiyle ortaya çıkar. İlki diziye eleman yerleştirme, ikincisi tür dönüştürme işlemiyle ilgilidir.

Bu nedenle hatayı çözerken önce görünür değişken türünü, ardından gerçek dizi türünü ve son olarak atanan değerin türünü karşılaştırmak gerekir.

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