জাভা লিস্ট.এডড () অসমর্থিত অপারেশন এক্সসেপশন


225

আমি List<String>উদাহরণগুলিতে বস্তুগুলি যুক্ত করার চেষ্টা করি তবে এটি একটি নিক্ষেপ করে UnsupportedOperationException। কোন এক কেন জানেন না?

আমার জাভা কোড:

String[] membersArray = request.getParameterValues('members');
List<String> membersList = Arrays.asList(membersArray);

for (String member : membersList) {
    Person person = Dao.findByName(member);
    List<String> seeAlso;
    seeAlso = person.getSeeAlso();
    if (!seeAlso.contains(groupDn)){
        seeAlso.add(groupDn);
        person.setSeeAlso(seeAlso);
    }
}

ত্রুটি বার্তা:

java.lang.UnsupportedOperationException
    java.util.AbstractList.add (অজানা উত্স)
    java.util.AbstractList.add (অজানা উত্স)
    javax.servlet.http.HttpServlet.service (HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service (HttpServlet.java:722)

উত্তর:


457

প্রতিটি Listবাস্তবায়ন add()পদ্ধতিটিকে সমর্থন করে না ।

একটি সাধারণ উদাহরণ এর Listদ্বারা প্রত্যাবর্তন করা হয় Arrays.asList(): এটি কোনও কাঠামোগত পরিবর্তন (যেমন উপাদানগুলি সরিয়ে বা যোগ করা) (জোর খনি) সমর্থন না করার ডকুমেন্টযুক্ত :

নির্দিষ্ট অ্যারে দ্বারা ব্যাক করা একটি স্থির-আকারের তালিকা ফেরত দেয় ।

এমনকি যদি এটি নির্দিষ্ট না করে Listআপনি সংশোধন করার চেষ্টা করছেন, উত্তরটি এখনও অন্য Listবাস্তবায়নের ক্ষেত্রে প্রযোজ্য যা হয় অপরিবর্তনীয় বা কেবল কিছু নির্বাচিত পরিবর্তনের অনুমতি দেয়।

আপনি "(alচ্ছিক ক্রিয়াকলাপ)" এর কোন দলিল UnsupportedOperationExceptionএবং এর ডকুমেন্টেশন পড়ে এটি সম্পর্কে জানতে পারেন List.add()। এই বাক্যাংশটির যথাযথ অর্থ Listডকুমেন্টেশনের শীর্ষে ব্যাখ্যা করা হয়েছে ।

কাজের ভিত্তিতে আপনি এই তালিকাটির অনুলিপিটি কোনও পরিচিত-সংশোধনযোগ্য বাস্তবায়নের জন্য তৈরি করতে পারেন যেমন ArrayList:

seeAlso = new ArrayList<>(seeAlso);

1
সুতরাং আমাকে তালিকার উদাহরণটি পরীক্ষার জন্য ব্যবহার করতে হবে যদি এটিতে আমার উপাদান এবং অ্যারে উদাহরণ থাকে তবে যখন আমাকে কোনও উপাদান যুক্ত করতে হয়? এটা কি লিখ?
FAjir

90
@ ফ্লোরিটো: এটি যদিও কাজ করবে: List<String> listMembres = new ArrayList<String>(Arrays.asList(tabMembres));:)
এমআর

বা হতে পারে আমাকে আমার তালিকা বস্তুটি অ্যারেলিস্ট বা অন্য কোনওটিতে কাস্ট করতে হবে?
এফএজির

2
না সত্যিই না. আপনি যদি এমন একটি Listপ্রয়োগে কোনও উপাদান যুক্ত করতে চান যা সংযোজন করতে দেয় না, তবে আপনাকে সেটিকে এমন Listএকটি প্রয়োগে অনুলিপি করতে হবে যা ( ArrayListএকটি সাধারণ প্রার্থী) এবং এতে যুক্ত করতে হবে।
জোচিম সৌর

8

তালিকার প্রয়োগের অনেকগুলি যোগ / অপসারণের জন্য সীমিত সমর্থন সমর্থন করে এবং অ্যারে.এএসএললিস্ট (সদস্যদের অ্যারে) এর মধ্যে একটি। আপনাকে java.util.ArrayList এ রেকর্ডটি সন্নিবেশ করতে হবে বা অ্যারেলিস্টে রূপান্তর করতে নীচের পদ্ধতিটি ব্যবহার করতে হবে।

আপনার কোডের সর্বনিম্ন পরিবর্তন সহ আপনি একটি তালিকা অ্যারেলিস্টে রূপান্তর করতে নীচে করতে পারেন। প্রথম সমাধানটি আপনার সমাধানে নূন্যতম পরিবর্তন আনছে, তবে দ্বিতীয়টি আরও অনুকূলিত হয়েছে, আমার ধারণা।

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = new ArrayList<>(Arrays.asList(membersArray));

অথবা

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = Stream.of(membersArray).collect(Collectors.toCollection(ArrayList::new));

4

উত্তরাধিকার ধারণাটি গঠন করুন, যদি বর্তমান শ্রেণিতে কিছু পার্টিকুলার পদ্ধতি না পাওয়া যায় তবে এটি সুপার ক্লাসে সেই পদ্ধতিটি অনুসন্ধান করবে। যদি এটি উপলব্ধ হয় এটি কার্যকর করে।

এটি AbstractList<E>ক্লাস add()পদ্ধতি কার্যকর করে যা ছুড়ে দেয় UnsupportedOperationException


আপনি যখন একটি অ্যারে থেকে সংগ্রহ ওবেজেক্টে রূপান্তর করছেন। অর্থ্যাৎ সংগ্রহ-ভিত্তিক এপিআই-তে অ্যারে-ভিত্তিক এটি তখন আপনাকে স্থির-আকারের সংগ্রহের অবজেক্ট সরবরাহ করবে, কারণ অ্যারের আচরণ স্থির আকারের।

java.util.Arrays.asList (টি ... ক)

রূপান্তর জন্য সস স্যাম্পেল।

public class Arrays {
    public static <T> List<T> asList(T... a) {
        return new java.util.Arrays.ArrayList.ArrayList<>(a); // Arrays Inner Class ArrayList
    }
    //...
    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
        //...
    }
}
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    public Iterator<E> iterator() {
        return new Itr();
    }
    private class Itr implements Iterator<E> {
        //...
    }

    public ListIterator<E> listIterator() {
        return listIterator(0);
    }
    private class ListItr extends Itr implements ListIterator<E> {
        //...
    }
}

উপরের উত্সটি তৈরি করুন যা আপনি পর্যবেক্ষণ করতে পারেন যে java.util.Arrays.ArrayListশ্রেণিটি তা করে না @Override add(index, element), set(index, element), remove(index)। সুতরাং, উত্তরাধিকার থেকে এটি সুপার AbstractList<E>ক্লাস add()ফাংশন কার্যকর করে যা ছুড়ে দেয় UnsupportedOperationException

হিসাবে AbstractList<E>একটি বিমূর্ত বর্গ এটি বাস্তবায়ন প্রদান করে iterator() and listIterator()। সুতরাং, আমরা তালিকা অবজেক্ট উপর পুনরাবৃত্তি করতে পারেন।

List<String> list_of_Arrays = Arrays.asList(new String[] { "a", "b" ,"c"});

try {
    list_of_Arrays.add("Yashwanth.M");
} catch(java.lang.UnsupportedOperationException e) {
    System.out.println("List Interface executes AbstractList add() fucntion which throws UnsupportedOperationException.");
}
System.out.println("Arrays → List : " + list_of_Arrays);

Iterator<String> iterator = list_of_Arrays.iterator();
while (iterator.hasNext()) System.out.println("Iteration : " + iterator.next() );

ListIterator<String> listIterator = list_of_Arrays.listIterator();
while (listIterator.hasNext())    System.out.println("Forward  iteration : " + listIterator.next() );
while(listIterator.hasPrevious()) System.out.println("Backward iteration : " + listIterator.previous());

আপনি এমনকি স্থির আকারের অ্যারে ফর্ম সংগ্রহ শ্রেণি তৈরি করতে পারেন Collections.unmodifiableList(list);

নমুনা উত্স:

public class Collections {
    public static <T> List<T> unmodifiableList(List<? extends T> list) {
        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }
}

Collection- কখনও কখনও একটি ধারক বলা হয় - কেবল এমন এক জিনিস যা একাধিক উপাদানকে একক ইউনিটে ভাগ করে দেয়। সংগ্রহগুলি সামগ্রিক ডেটা সঞ্চয়, পুনরুদ্ধার, হেরফের এবং যোগাযোগ করার জন্য ব্যবহৃত হয়।

@আরো দেখুন


3

আপনাকে অবশ্যই আপনার তালিকাটি আরম্ভ করতে হবে:

List<String> seeAlso = new Vector<String>();

অথবা

List<String> seeAlso = new ArrayList<String>();

2
একটি uninitialized পরিবর্তনশীল কারণ হবে না UnsupportedOperationExceptionadd()। পরিবর্তে আপনি একটি এনপিই পাবেন।
স্টিফেন সি

0

সদস্য তালিকা তালিকাভুক্ত করুন = অ্যারে.এএসলিস্ট (সদস্যরাশ্রয়ী);

অপরিবর্তনীয় তালিকা ফিরিয়ে দেয়, আপনাকে যা করতে হবে তা হ'ল

নতুন অ্যারেলিস্ট <> (অ্যারে.এএসলিস্ট (সদস্যআরাই)); এটি পরিবর্তনীয় করতে


এটি কোনও পরিবর্তনযোগ্য তালিকা নয়। তালিকার দৈর্ঘ্য পরিবর্তন না করে এমন মিউটেশন অপারেশনগুলি সমর্থিত / কাজ করবে। মূল বিষয় হ'ল তালিকার দৈর্ঘ্য পরিবর্তন হতে পারে না কারণ তালিকাটি একটি অ্যারের দ্বারা ব্যাক করা হয়েছে ... যার দৈর্ঘ্য পরিবর্তন হতে পারে না।
স্টিফেন সি

-1

অ্যাড () ব্যবহার করার পরিবর্তে আমরা অ্যাডল () ব্যবহার করতে পারি

{ seeAlso.addall(groupDn); }

অ্যাড একটি একক আইটেম যুক্ত করে, যখন অ্যাডএল সংগ্রহ থেকে প্রতিটি আইটেম যুক্ত করে। শেষ পর্যন্ত, উভয় পদ্ধতিই সত্যটি ফিরে আসে যদি সংগ্রহটি সংশোধন করা হয়েছে। অ্যারেলিস্টের ক্ষেত্রে এটি তুচ্ছ, কারণ সংগ্রহটি সর্বদা সংশোধন করা হয়, তবে সেটগুলির মতো অন্যান্য সংগ্রহগুলি যদি আইটেম যুক্ত করা থাকে তবে তা মিথ্যা ফিরে আসতে পারে।


-3

আপনি একটি এলডিএপি ক্যোয়ারী থেকে ফলাফল পরিবর্তন করতে পারবেন না। আপনার সমস্যা এই লাইনে রয়েছে:

seeAlso.add(groupDn);

দেখুন আলোর তালিকাটি অবিশ্বাস্য।


1
সমস্যাটি সেই কারণে নয় তবে জোয়াকিম উপরে উল্লিখিত হিসাবে এটি তালিকার বাস্তবায়নগুলি করা যা অ্যাড () যোগ করতে পারে না।
লিভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.