programing

Java List.add() 지원되지 않는 조작예외.

javaba 2022. 8. 14. 17:55
반응형

Java List.add() 지원되지 않는 조작예외.

오브젝트를 추가하려고 합니다.List<String>예를 들어, 예를 들어,UnsupportedOperationException왜 그런지 아는 사람?

내 Java 코드:

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.displaces를 클릭합니다.지원되지 않는 조작예외.java.displaces를 클릭합니다.AbstractList.add(알 수 없는 소스)java.displaces를 클릭합니다.AbstractList.add(알 수 없는 소스)javax.servlet.disples.disples.HttpServlet.service(HttpServlet.java:641)javax.servlet.disples.disples.HttpServlet.service(HttpServlet.java:722)

모든 구현이 다음을 지원하는 것은 아닙니다.add()방법.

일반적인 예로는List반환: 구조 변경(즉, 요소 제거 또는 추가)을 지원하지 않는 것으로 문서화되어 있습니다(내부 광산).

지정된 배열에서 지원하는 고정 크기 목록을 반환합니다.

비록 그게 특별하지 않더라도List수정하려고 하는 경우 답변은 다른 사용자에게도 적용됩니다.List변경할 수 없거나 선택한 일부 변경만 허용하는 구현입니다.

이것에 대해서는, 및 의 메뉴얼을 참조해 주세요.이 매뉴얼은 (옵션 조작)이라고 기재되어 있습니다.이 문구의 정확한 의미는 의 맨 위에 설명되어 있습니다.List문서를 참조해 주세요.

회피책으로서 리스트의 카피를 작성해, 다음과 같이 변경 가능한 기존의 실장에 적용할 수 있습니다.ArrayList:

seeAlso = new ArrayList<>(seeAlso);

목록 구현의 대부분은 제한적인 추가/삭제 지원을 지원하며 Arrays.asList(membersArray)도 그 중 하나입니다.레코드를 java.util에 삽입해야 합니다.ArrayList 또는 다음 방법을 사용하여 ArrayList로 변환합니다.

코드를 최소한으로 변경하여 목록을 Array List로 변환할 수 있습니다.첫 번째 솔루션은 솔루션에 최소한의 변경을 가하는 것이지만, 두 번째 솔루션은 더 최적화되어 있을 것입니다.

    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));

상속 개념을 형성합니다. 현재 클래스에서 일부 Perticular 메서드를 사용할 수 없는 경우 슈퍼 클래스에서 해당 메서드를 검색합니다.사용 가능한 경우 실행됩니다.

이 명령어는 를 슬로우하는 클래스 메서드를 실행합니다.


어레이에서 컬렉션 Obejct(어레이 기반에서 컬렉션 기반 API)로 변환하는 경우 어레이의 동작은 고정 크기이므로 고정 크기 컬렉션 개체가 제공됩니다.

java.displaces를 클릭합니다.Arrays.asList(T...a)

확인을 위해 샘플을 준비합니다.

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> {
        //...
    }
}

하면, 상의의의 form form, form form form 、 「 의 。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));
    }
}

A(컨테이너라고도 함)는 여러 요소를 하나의 단위로 그룹화하는 단순한 개체입니다.수집은 집계 데이터를 저장, 검색, 조작 및 통신하는 데 사용됩니다.

@도 참조

이는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아add a까지List<T>에 의해 반환되었습니다.

지정된 개체만 포함하는 불변의 목록을 반환합니다.반환된 목록은 직렬화할 수 있습니다.

이 JVM을 add()★★★★★★에Collections.singletonList

목록 membersList = Arrays.asList(membersArray);

불변의 리스트를 반환한다.필요한 것은,

new ArrayList <>(Arrays.asList(membersArray)), 변경 가능하게 하기 위해

목록을 초기화해야 합니다( 참조).

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

또는

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

LDAP 쿼리의 결과는 수정할 수 없습니다.문제는 다음과 같습니다.

seeAlso.add(groupDn);

seeAlso 목록은 수정할 수 없습니다.

add() 대신 addall()을 사용할 수 있습니다.

{ seeAlso.addall(groupDn); }

add는 단일 항목을 추가하고 addAll은 컬렉션의 각 항목을 하나씩 추가합니다.최종적으로 컬렉션이 변경된 경우 두 메서드 모두 true를 반환합니다.ArrayList의 경우 컬렉션은 항상 변경되지만 추가 중인 항목이 이미 있으면 Set 등의 다른 컬렉션이 false를 반환할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5755477/java-list-add-unsupportedoperationexception

반응형