Java List.add () UnsupportedOperationException
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)
모든 List
구현이 add()
메소드를 지원하는 것은 아닙니다 .
하나의 일반적인 예는 다음과 같이 List
반환됩니다 Arrays.asList()
. 구조적 수정 (예 : 요소 제거 또는 추가)을 지원 하지 않는 것으로 문서화 되어 있습니다 (강조 광산).
지정된 배열이 지원 하는 고정 크기 목록을 반환합니다 .
그것이 List
수정하려는 특정 내용 이 아니더라도 대답은 여전히 List
변경 불가능하거나 선택한 일부 변경 만 허용 하는 다른 구현에 적용됩니다 .
UnsupportedOperationException
및 의 설명서를 읽고이 정보를 List.add()
"(선택적 작업)"으로 확인 하면 이에 대해 알 수 있습니다 . 이 문구의 정확한 의미는 List
설명서 맨 위에 설명되어 있습니다.
이 문제를 해결하려면 다음과 같이 알려진 수정 가능한 구현에 대한 목록 사본을 작성할 수 있습니다 ArrayList
.
seeAlso = new ArrayList<>(seeAlso);
List를 초기화해야합니다.
List<String> seeAlso = new Vector<String>();
또는
List<String> seeAlso = new ArrayList<String>();
많은 List 구현은 추가 / 제거에 대한 제한된 지원을 지원하며 Arrays.asList (membersArray)가 그 중 하나입니다. java.util.ArrayList에 레코드를 삽입하거나 아래 방법을 사용하여 ArrayList로 변환해야합니다.
코드를 최소한으로 변경하면 아래에서 목록을 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));
상속 개념을 형성하십시오. 현재 클래스에서 일부 perticular 메소드를 사용할 수 없으면 수퍼 클래스에서 해당 메소드를 검색합니다. 사용 가능한 경우 실행됩니다.
던지는
AbstractList<E>
클래스add()
메소드를 실행UnsupportedOperationException
합니다.
Array에서 Collection Obejct로 변환 할 때 즉, 배열 기반의 컬렉션 기반 API에서 배열의 동작은 고정 크기이므로 고정 크기의 컬렉션 객체를 제공합니다.
java.util.Arrays.asList (T ... a)
형태를위한 Souce 샘플.
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 the above Source you may observe that java.util.Arrays.ArrayList
class doesn't @Override add(index, element), set(index, element), remove(index)
. So, From inheritance it executes super AbstractList<E>
class add()
function which throws UnsupportedOperationException
.
As AbstractList<E>
is an abstract class it provides the implementation to iterator() and listIterator()
. So, that we can iterate over the list object.
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());
You can even create Fixed-Size array form Collections class Collections.unmodifiableList(list);
Sample Source:
public class Collections {
public static <T> List<T> unmodifiableList(List<? extends T> list) {
return (list instanceof RandomAccess ?
new UnmodifiableRandomAccessList<>(list) :
new UnmodifiableList<>(list));
}
}
A Collection
— sometimes called a container — is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.
@see also
instead of using add() we can use addall()
{ seeAlso.addall(groupDn); }
add adds a single item, while addAll adds each item from the collection one by one. In the end, both methods return true if the collection has been modified. In case of ArrayList this is trivial, because the collection is always modified, but other collections, such as Set, may return false if items being added are already there.
List membersList = Arrays.asList(membersArray);
returns immutable list, what you need to do is
new ArrayList<>(Arrays.asList(membersArray)); to make it mutable
You cannot modify a result from a LDAP query. Your problem is in this line:
seeAlso.add(groupDn);
The seeAlso list is unmodifiable.
참고URL : https://stackoverflow.com/questions/5755477/java-list-add-unsupportedoperationexception
'Programing' 카테고리의 다른 글
SQL Server 2008에서 테이블 별칭으로 UPDATE SQL을 작성하는 방법은 무엇입니까? (0) | 2020.05.15 |
---|---|
MySQL에서 열 이름 바꾸기 (0) | 2020.05.15 |
Python으로 Windows에서 실행 중인지 어떻게 확인합니까? (0) | 2020.05.15 |
원래 배열을 변경하지 않고 어떻게 배열을 정렬 할 수 있습니까? (0) | 2020.05.15 |
SVN 작업 디렉토리에서 모든 변경 사항을 제거하려면 어떻게해야합니까? (0) | 2020.05.15 |