Java "java.lang.UnsupportedOperationException" hatasını çözmek için yığın izinde uygulamana ait sınıf ve satırı bul, o satırdaki add veya remove çağrısını belirle, ardından listenin List.of(...), Arrays.asList(...) ya da başka bir ifadeyle nasıl oluşturulduğunu kontrol et. Değişiklik gerekiyorsa, bu işlemleri destekleyen değiştirilebilir bir liste, örneğin ArrayList, kullan.
Hata metni, listenin kendisinde mutlaka bir sorun olduğunu değil, istenen değişikliğin o listenin desteklediği işlemler arasında olmadığını gösterir. Bu nedenle çözüm, istisnayı gizlemek yerine liste kaynağı ile yapmak istediğin işlemi eşleştirmektir.
Yığın izinde hatanın oluştuğu satırı nasıl bulursun?

Yığın izini okurken aşağıdaki sırayı izle. Java, istisna adını ve çağrı sırasında oluşan sınıf, metot, dosya ve satır bilgilerini yığın izinde gösterir.
- İstisna adı: İlk satırda
java.lang.UnsupportedOperationExceptionifadesini ara. Bu, desteklenmeyen bir işlem çağrıldığını gösterir. - Proje satırı: Uygulamana ait ilk anlamlı satırı bul. Örneğin
Main.main(Main.java:6)ifadesi, çağrınınMain.javadosyasının 6. satırında yapıldığını belirtir. - Çağrılan işlem: Gösterilen satırda
add,removeveya başka bir liste değiştirme çağrısı olup olmadığını kontrol et. Java add hatasında sorun çoğunlukla bu satırda görünür. - Listenin oluşturulma noktası: Aynı değişkenin daha önce nerede atandığını bul.
List.of(...)veyaArrays.asList(...)gibi bir kaynak görürsen, listenin değişiklik kısıtını buradan teşhis edebilirsin.
Örneğin aşağıdaki kodda hata, listedeki öğe sayısını add çağrısıyla artırmaya çalışırken oluşur:
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> dersler = List.of("Java", "Python");
dersler.add("SQL");
}
}
Çalıştırıldığında yığın izinin ilgili bölümü şöyle olabilir:
Exception in thread "main" java.lang.UnsupportedOperationException
at Main.main(Main.java:6)
Main.java:6 satırını açtığında dersler.add("SQL") çağrısını görürsün. Bundan sonra dersler değişkeninin oluşturulduğu satıra geri dön ve listenin değiştirilebilir olup olmadığını kontrol et. UnsupportedOperationException yalnızca listelere özgü değildir; Java API'sinde istenen işlemin desteklenmediğini bildiren genel bir istisnadır.
Listenin nasıl oluşturulduğu neden önemlidir?
Bir değişiklik çağrısının desteklenip desteklenmediği, değişkenin yalnızca List olarak tanımlanmasından değil, arkasındaki listenin nasıl oluşturulduğundan anlaşılır. List.of(...) değiştirilemeyen bir liste üretir, Arrays.asList(...) sabit boyutlu bir liste görünümü sunar, new ArrayList<>(...) ise boyut değiştirmeyi destekleyen yeni bir liste oluşturur.
| Liste kaynağı | add ve remove davranışı |
Boyut değişikliği sonucu | Değişiklik gerekiyorsa yaklaşım |
|---|---|---|---|
List.of(...) |
Desteklenmez, çağrı UnsupportedOperationException oluşturur. |
Listeye öğe eklenemez veya öğe çıkarılamaz. | new ArrayList<>(...) ile yeni bir liste oluştur. |
Arrays.asList(...) |
Boyut değiştiren add ve remove çağrıları desteklenmez. |
Liste sabit boyutlu kalır ve bu çağrılar UnsupportedOperationException oluşturur. |
Öğe sayısı değişecekse new ArrayList<>(...) kullan. |
new ArrayList<>(...) |
add ve remove desteklenir. |
Liste büyütülebilir veya küçültülebilir. | Değişiklikleri bu liste üzerinde yap. |
Arrays.asList(...) ile oluşturulan listede set çağrısı mevcut bir öğeyi değiştirebilir, ancak öğe sayısını değiştiremez. Listeyi yalnızca okumak veya mevcut öğeyi set ile değiştirmek yeterliyse kopya oluşturmak zorunlu değildir. Öğe eklemek ya da çıkarmak gerekiyorsa new ArrayList<>(kaynakListe), kaynak koleksiyonun öğelerini içeren yeni bir liste oluşturur ve değişiklikleri bu yeni liste üzerinde yapabilirsin.
add çağrısı nasıl hata verir ve ArrayList kopyası nasıl çalışır?

Yığın izinde languages.add("Python") satırını gördüğünde, listenin nasıl oluşturulduğu ifadeye bak. List.of(...) ile oluşturulan liste değiştirilemez. Bu nedenle add çağrısı çalışma zamanında java.lang.UnsupportedOperationException üretir. Listeye yeni eleman eklenmesi gerekiyorsa, değiştirilebilir bir liste seçmen veya mevcut veriden kopya oluşturman gerekir.
import java.util.List;
public class UnsupportedOperationExample {
public static void main(String[] args) {
List<String> languages = List.of("Java");
languages.add("Python");
}
}
Çalışma sırasında görülen temel hata metni: java.lang.UnsupportedOperationException.
Liste yalnızca okunacaksa kopya oluşturmak zorunlu değildir. Kopya, ancak add veya remove gibi yapısal bir değişiklik gerektiğinde kullanılır. Arrays.asList(...) ile elde edilen boyutu sabit listelerde de boyut değiştiren bu işlemler desteklenmez. Bu istisna yalnızca listelerde görülmez; genel olarak desteklenmeyen bir işlem için de kullanılabilir.
Değişiklik gerekiyorsa new ArrayList<>(source) ifadesi, kaynak koleksiyonun elemanlarını yeni bir ArrayList içine alır. Böylece ekleme ve silme işlemleri kopyanın liste yapısı üzerinde uygulanır.
import java.util.ArrayList;
import java.util.List;
public class ArrayListCopyExample {
public static void main(String[] args) {
List<String> source = List.of("Java");
List<String> languages = new ArrayList<>(source);
languages.add("Python");
System.out.println(languages);
}
}
Beklenen çıktı: [Java, Python]
Üç soruluk teşhis akışıyla doğru çözümü seç
Hatanın kaynağını ayırmak için aşağıdaki üç soruyu bu sırayla yanıtla:
- 1. Veri kaynağı nedir? Listenin
List.of,Arrays.asListveya başka bir oluşturma biçiminden gelip gelmediğini kontrol et. - 2. Hangi işlem çağrıldı? Özellikle
addya daremoveçağrısını yığın izinde işaretlenen satırla eşleştir. - 3. Liste gerçekten değişmeli mi? Değişiklik gerekmiyorsa mevcut listeyi kopyalamadan kullan. Gerekiyorsa
new ArrayList<>(...)ile değiştirilebilir bir kopya oluştur.
try-catch yalnızca bilinçli bir alternatif akış veya hata yönetimi gerekiyorsa düşünülmelidir. İstisnayı yakalayıp yok saymak, listenin desteklemediği işlemi desteklenir hâle getirmez. Çözüm, yapılacak işlemle uyumlu liste yapısını seçmektir.
Java koleksiyonları ve liste işlemleriyle ilgili bilgini pekiştirmek için Java bilgi testini çözebilirsin.
Doğru çözüm, istisnayı gizlemek değil, listenin oluşturulma biçimiyle yapılacak işlemi eşleştirmektir.