Unsupportedoperationexception java что это

Почему я получаю UnsupportedOperationException при попытке удалить элемент из списка?

У меня есть этот код:

Как это будет правильно? Java.15

ОТВЕТЫ

Ответ 1

Довольно много проблем с вашим кодом:

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

Вкл split с использованием регулярного выражения

О лучшем алгоритме

Ответ 2

Это сожгло меня много раз. Arrays.asList создает немодифицируемый список. Из Javadoc: возвращает список фиксированного размера, поддерживаемый указанным массивом.

Создайте новый список с тем же контентом:

Это создаст немного лишнего мусора, но вы сможете его мутировать.

Ответ 3

Возможно, потому, что вы работаете с немодифицируемой оболочкой.

Измените эту строку:

Ответ 4

Я думаю, что замена:

Ответ 5

Ответ 6

Просто прочитайте JavaDoc для метода asList:

Возвращает список <@code List>объектов в указанном массиве. Размер <@code List>не может быть изменен, то есть добавление и удаление неподдерживаемые, но элементы могут быть задавать. Установка элемента изменяет базовый массив.

Это из Java 6, но похоже, что он одинаковый для java версии android.

ИЗМЕНИТЬ

Ответ 7

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

Обновление. Как отмечено ниже, этот алгоритм имеет смысл только в том случае, если элементы неупорядочены, например. если Список представляет собой Сумку. Если, с другой стороны, Список имеет значимый порядок, этот алгоритм не сохранит его (вместо этого алгоритм полигенных смазок).

Обновление 2. Таким образом, в ретроспективе лучший (линейный, поддерживающий порядок, но с O (n) случайным числом) алгоритм будет примерно таким:

Ответ 8

У меня есть другое решение для этой проблемы:

работает над newList 😉

Ответ 9

Ответ 10

Пример:

Ответ 11

Вы не можете удалить и не добавить в список массивов с фиксированным размером.

Но вы можете создать свой подсписок из этого списка.

это создаст ArrayList, который не является фиксированным размером, например Arrays.asList

Ответ 12

Ниже приведен фрагмент кода из массивов

так что происходит, когда вызывается метод asList, он возвращает список своей собственной частной статической версии класса, которая не отменяет добавление funcion из AbstractList для хранения элемента в массиве. Поэтому по умолчанию метод add в абстрактном списке вызывает исключение.

Таким образом, это не обычный список массивов.

Ответ 13

или (лучше для удаления элементов)

Ответ 14

Arraylist narraylist = Arrays.asList(); // Возвращает неизменяемый arraylist Чтобы сделать его изменяемым, было бы следующее: Arraylist narraylist = new ArrayList (Arrays.asList());

Ответ 15

Arrays.asList() использует массив фиксированного размера внутри.
Вы не можете динамически добавлять или удалять из этого Arrays.asList()

В narraylist вы можете легко добавлять или удалять элементы.

Ответ 16

Создание нового списка и заполнение допустимых значений в новом списке работало для меня.

Источник

Понимание UnsupportedOperationException

Я не совсем понимаю, где я могу выбросить это исключение.

Например, я реализую интерфейс Future и не хочу, чтобы кто-либо вызывал этот метод:

Дело в том, что в спецификации метода ничего не говорится о выдаче исключения. Исключение, в свою очередь

выбрасывает, чтобы указать, что запрошенная операция не поддерживается.

3 ответа

Технически UnsupportedOperationException не отмечен, и поэтому может быть брошен где угодно. Однако размещение его в неожиданных местах сделает ваш класс менее простым в использовании, и это не рекомендуется.

В вашем случае «get» по времени очень важен для использования Future, и вы вызовете некоторое удивление, если не реализуете его. если вы собираетесь это сделать, убедитесь, что это хорошо задокументировано, и имейте в виду, что это приведет к тому, что ваша реализация Future в некоторых случаях станет непригодной для использования и потенциально может вызвать сбой программы, которая ее использует.

Если у вас просто нет ресурсов для написания синхронизированного get для вашей реализации Future, рассмотрите возможность использования уже существующей реализации, например расширения вашего класса из FutureTask.

Автором UnsupportedException является Джошуа Блох и согласно его книге, а также из FAQ по дизайну коллекций, если объект не поддерживает операцию, метод может вызвать исключение UnsupportedException.

Следует соблюдать осторожность, прежде чем создавать это исключение в вашем методе, поскольку оно имеет тип RuntimeException / unchecked exception.

Автор книги и класса UnsupportedException : Джошуа Блох

Если вы хотите, чтобы вызывающие вашего метода знали, что операция не поддерживается, вы можете вызвать исключение UnsupportedOperationException.

Вы можете проверить здесь :

Это исключение расширяет класс RuntimeException и, таким образом, принадлежит к тем исключениям, которые могут возникать во время работы виртуальной машины Java (JVM). Это непроверенное исключение, поэтому его не нужно объявлять в предложении throws метода или конструктора. Более того, исключение UnsupportedOperationException существует с версии Java 1.2.

Источник

Как побороть UnsupportedOperationException: null в Spring?

Столкнулся с довольно странной проблемой. Имеется entity User и объекты этого класса нужно связать друг с другом через many-to-many relationship. Соответственно, помимо основной таблицы «user» должны появиться еще 2 таблицы «customer_authors» «author_customers»

Нигде в моем коде не используется Arrays asList() / не создается список с фиксированным размером. Именно, это является причиной подобной ошибки согласно поиску в гугл и stackoverflow.

В моем случае, если в @Service UserService использовать подобный код:

Но при этом, если для теста в контроллере использовать что-то подобное:

то действительно, в таблицу добавляется нужная информация ID реферрера и ID пользователя.

В чем может быть заключаться ошибка? Может быть, кто-то сталкивался с этим и знает, как исправить? Заранее благодарю!

Полный сниппет метода из UserService:

2 ответа 2

Unsupportedoperationexception java что это. qcLtW. Unsupportedoperationexception java что это фото. Unsupportedoperationexception java что это-qcLtW. картинка Unsupportedoperationexception java что это. картинка qcLtW

Unsupportedoperationexception java что это. photo. Unsupportedoperationexception java что это фото. Unsupportedoperationexception java что это-photo. картинка Unsupportedoperationexception java что это. картинка photo

Откуда взялся UnsupportedOperationException?

Коллекции в Java могут иметь необязательные для реализации методы.
При вызове метода, имплементация которого не предусмотрена в данной реализации выбрасывается UnsupportedOperationException :

Наличие подобных методов в интерфейсе может вызвать недоумение, однако в данном случае, насколько я понимаю, это вызвано поддержкой обратной совместимости с более старыми версиями Java.

Как уже говорилось другими участниками, коллекции могут быть изменяемыми и неизменяемыми. Однако, вопреки общему мнению в данном случае исключение возникает не из-за использования Arrays.asList (автор явно инициализирует поля новым объектом ArrayList’а ).
Хотя это было очень-очень близко и копать явно нужно было в эту сторону.

Ошибка была куда прозаичнее:

Автор явно создаёт синглтон(немодифицируемую коллекцию) и передаёт его в список ролей.

После чего данный объект успешно сохраняется.

Ошибка же возникает после того как мы добавляем данного пользователя в список приглашенных клиентов другого пользователя и сохраняем второго пользователя(приглашающего), который был предварительно получен с помощью hibernate.

Чтобы исправить это достаточно просто написать:

И cascade=CascadeType.ALL в данном случае не при чем.
Тем не менее его оставлять так нельзя. Потому что, при удалении приглашающего пользователя автоматически будут удалены и все авторы и клиенты, что как мне кажется не соответствует замыслам автора.

Над данными двумя полями( authorsList и customersList ) стоит как минимум поставить

А если говорить честно, то данные поля являются избыточными и от них можно просто избавиться.
Ведь для каждого приглашенного пользователя мы устанавливаем referrer(пригласившего пользователя).
Соответственно мы можем либо добавить обратное свойство invitedUsers и отфильтровать его по роли.
Либо просто выбрать пользователей по referrer’у и роли.

Источник

Почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка?

у меня есть этот код:

Как это было бы правильно? Ява.15

12 ответов

очень много проблем с вашим кодом:

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

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

исправить

On split принимая regex

исправления:

по лучшему алгоритму

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

создать новый список с тем же содержанием:

это создаст немного лишнего мусора, но вы сможете видоизменить ее.

вероятно, потому, что вы работаете с неизменяемым фантик.

измените эту строку:

Я думаю, что заменить:

просто прочитайте JavaDoc для метода asList:

это из Java 6, но похоже, что это то же самое для Android java.

редактировать

массивы.asList () возвращает список, который не позволяет операциям влиять на его размер (обратите внимание, что это не то же самое, что «unmodifiable»).

вы могли бы сделать new ArrayList (Arrays.asList(split)); чтобы создать реальную копию, но видя, что вы пытаетесь сделать, вот еще одно предложение (у вас O(n^2) алгоритм прямо под этим).

обновление: как отмечено ниже, этот алгоритм имеет смысл только в том случае, если элементы неупорядочены, например, если список представляет собой мешок. Если, с другой стороны, в списке есть разумный порядок, этот алгоритм не позволит сохранить его алгоритм (polygenelubricants вместо бы.)

обновление 2: таким образом, в ретроспективе, лучший(линейный, поддерживающий порядок, но с O (n) случайными числами) алгоритм будет примерно таким:

Источник

Java List.add() UnsupportedOperationException

Unsupportedoperationexception java что это. sboSL. Unsupportedoperationexception java что это фото. Unsupportedoperationexception java что это-sboSL. картинка Unsupportedoperationexception java что это. картинка sboSL

8 Answers 8

Not every List implementation supports the add() method.

One common example is the List returned by Arrays.asList() : it is documented not to support any structural modification (i.e. removing or adding elements) (emphasis mine):

Returns a fixed-size list backed by the specified array.

Even if that’s not the specific List you’re trying to modify, the answer still applies to other List implementations that are either immutable or only allow some selected changes.

As a workaround you can create a copy of the list to a known-modifiable implementation like ArrayList :

Many of the List implementation support limited support to add/remove, and Arrays.asList(membersArray) is one of that. You need to insert the record in java.util.ArrayList or use the below approach to convert into ArrayList.

With the minimal change in your code, you can do below to convert a list to ArrayList. The first solution is having a minimum change in your solution, but the second one is more optimized, I guess.

Form the Inheritance concept, If some perticular method is not available in the current class it will search for that method in super classes. If available it executes.

When you are converting from an Array to a Collection Obejct. i.e., array-based to collection-based API then it is going to provide you fixed-size collection object, because Array’s behaviour is of Fixed size.

Souce samples for conformation.

You can even create Fixed-Size array form Collections class Collections.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.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *