İçeriğe geç

Menü

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

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

java-lang-unsupportedoperationexception-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Yığın izinde hatanın oluştuğu satırı nasıl bulursun?
  2. Listenin nasıl oluşturulduğu neden önemlidir?
  3. add çağrısı nasıl hata verir ve ArrayList kopyası nasıl çalışır?
  4. Üç soruluk teşhis akışıyla doğru çözümü seç

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 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.

  1. İstisna adı: İlk satırda java.lang.UnsupportedOperationException ifadesini ara. Bu, desteklenmeyen bir işlem çağrıldığını gösterir.
  2. Proje satırı: Uygulamana ait ilk anlamlı satırı bul. Örneğin Main.main(Main.java:6) ifadesi, çağrının Main.java dosyasının 6. satırında yapıldığını belirtir.
  3. Çağrılan işlem: Gösterilen satırda add, remove veya 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.
  4. Listenin oluşturulma noktası: Aynı değişkenin daha önce nerede atandığını bul. List.of(...) veya Arrays.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?

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. 1. Veri kaynağı nedir? Listenin List.of, Arrays.asList veya başka bir oluşturma biçiminden gelip gelmediğini kontrol et.
  2. 2. Hangi işlem çağrıldı? Özellikle add ya da remove çağrısını yığın izinde işaretlenen satırla eşleştir.
  3. 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.

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