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?

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:
- Görünür değişken türü:
valuesdeğişkeni kaynak koddaObject[]olarak tanımlanmıştır. Bu yüzden derleyici, bu referans üzerinden farklı nesne türlerinin atanmasına izin verebilir. - Gerçek dizi nesnesinin türü:
values,namesüzerinden oluşturulmuştur.new String[1]ifadesi bellekte gerçek bileşen türüStringolan birString[]oluşturur. - Atanan değerin türü:
Integer.valueOf(42)ifadesinin ürettiği nesneIntegertüründedir. Bu değer, gerçek bileşen türüStringolan 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?

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:
- Sol taraftaki görünür türü oku: Değişken
Object[] diziolarak 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. newifadesini kontrol et:Object[] dizi = new String[2];satırında gerçek dizi nesnesiString[]türündedir.Object[]yalnızca bu nesneye erişen referansın görünür türüdür.- Atanan değerin gerçek türünü belirle:
dizi[0] = 42;ifadesindeki sayı, kutulama sonucunda birIntegernesnesi olarak diziye yazılmak istenir. Bu değerStringdeğildir. - Uyumluluğu sorgula: Gerçek dizi
String[]olduğuna göre her elemanınStringile uyumlu olması gerekir.Integerbu bileşen türüyle uyumlu olmadığı için atama çalışma zamanında başarısız olur. - Veri yapısını amaca göre seç: Yalnızca metin tutulacaksa
String[]veyaList<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.