2014-09-02 3 views
24

List.addВыбрасываете UnsupportedOperationException при попытке добавить другой список.List.addAll throwing UnsupportedOperationException при попытке добавить другой список

List<String> supportedTypes = Arrays.asList("6500", "7600"}; 

и в цикле я делаю,

supportedTypes.addAll(Arrays.asList(supportTypes.split(","))); //line 2 

чтение supportTypes из файла.

Но строка 2 выбрасывает UnsupportedOperationException, но я не могу определить, почему?

Я добавляю еще один список в список, то почему эта операция не поддерживается?

ответ

47

Arrays.asList возвращает список фиксированного размера, поддерживаемый массивом, и вы не можете добавлять к нему элементы.

Вы можете создать изменяемый список, чтобы addAll работы:

List<String> supportedTypes = new ArrayList<String>(Arrays.asList("6500", "7600", "8700"));

+0

supportedTypes - это список, и я добавляю к нему. – Batty

+0

@Batty - и в этом проблема. Это не работает. Javadoc для 'asList' дает понять, что это не сработает. Конец истории. Вы НЕ МОЖЕТЕ добавить элементы в список, созданный с помощью 'asList'. Период. –

+1

Список - это интерфейс, текущая реализация должна реализовать все его методы, но эта реализация может вызвать исключение, чтобы сказать «этот метод здесь не имеет смысла», –

7

Arrays.asList возвращает список фиксированного размера.

Если вы хотите иметь возможность добавлять элементы в список, сделайте следующее:

List<String> supportedTypes = new ArrayList<>(Arrays.asList("6500", "7600"}); 
supportedTypes.addAll(Arrays.asList(supportTypes.split(","))); 
4

Проблема заключается в том, что Arrays.asList метод возвращает экземпляр java.util.Arrays.ArrayList, который не поддерживает добавлять/удалять операции над элементами. Это не surprizing что addAll метод генерирует исключение, потому что метод дополнения для java.util.Arrays.ArrayList определяется как:

public void add(int index, E element) { 
    throw new UnsupportedOperationException(); 
} 

связанный с этим вопрос:

Arrays.asList() Confusing source code

От documentation:

Arrays.asList возвращает список фиксированного размера, поддерживаемый указанным массивом.

2

Эта ошибка также происходит, когда список инициализируется Collections.emptyList(), который неизменен:

List<String> myList = Collections.emptyList(); 

Вместо этого инициализировать его с изменяемым списка. Например

List<String> myList = new ArrayList<>(); 
Смежные вопросы