Какая ошибка возникает при добавлении элемента в нересайзабельную коллекцию List в Java
Что проверяют
Знаете ли вы, что неизменяемость List в Java проверяется только во время выполнения, и какие фабрики возвращают такие списки. Следом спрашивают, чем Arrays.asList отличается от List.of и от Collections.unmodifiableList.
Как отвечать
Бросается UnsupportedOperationException, непроверяемое исключение. Метод add в интерфейсе List описан как необязательная операция: компилятор вызов пропустит, а реализация вправе отказаться. Базовый AbstractList так и делает, если класс не переопределил add.
Откуда берутся такие списки и чем они различаются:
Arrays.asList(...): список фиксированного размера поверх исходного массива.addиremoveбросают исключение, аsetработает и меняет сам массив, изменения видны с обеих сторон;List.of(...)иList.copyOf(...): полностью неизменяемые, падает иset. К тому же они не принимаютnull,List.of(null)даётNullPointerException;Collections.unmodifiableList(list): не копия, а обёртка только для чтения. Через неё менять нельзя, но изменения исходного списка через неё видны;stream.toList()иCollectors.toUnmodifiableList(): неизменяемый результат. ОбычныйCollectors.toList()сейчас отдаётArrayList, но спецификация этого не обещает;Collections.emptyList()иCollections.singletonList(x): тоже без добавления.
Если нужен изменяемый список, копируйте явно: new ArrayList<>(Arrays.asList(a, b)) или new ArrayList<>(List.of(...)). А в API неизменяемые списки возвращают намеренно, чтобы вызывающий код не поменял внутреннее состояние объекта.
Где спотыкаются
Называют ConcurrentModificationException. Оно бросается при изменении коллекции во время обхода итератором, к фиксированному размеру отношения не имеет.
Считают Arrays.asList полностью неизменяемым. На деле set проходит и тихо правит массив, из которого список создан, и это источник неожиданных багов.
Путают обёртку и копию: отдают наружу Collections.unmodifiableList(internal) и уверены, что список снаружи не поменяется. Поменяется, если класс сам изменит internal, так что для настоящей защиты нужен List.copyOf.