1.问题描述
今天在做算法的时候用到了list.add()方法,结果报了UnsupportedOperationException 错误
List<List<String>> res = new ArrayList<>();
//中间代码省略
res.get(key).add(str);
2.分析
去网上查了之后基本上都是由于使用了Arrays.asList()方法导致的报错,而我并没有使用这个方法。经过调试之后发现,问题出在get方法返回的list。由于我传入的对象是List,而list.get()方法返回的集合默认是Collections下的内部静态类SingletonList。
private static class SingletonList<E> extends AbstractList<E> implements RandomAccess, Serializable {
private static final long serialVersionUID = 3093736618740652951L;
private final E element;
SingletonList(E obj) {
this.element = obj;
}
public Iterator<E> iterator() {
return Collections.singletonIterator(this.element);
}
public int size() {
return 1;
}
public boolean contains(Object obj) {
return Collections.eq(obj, this.element);
}
public E get(int index) {
if (index != 0) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: 1");
} else {
return this.element;
}
}
public void forEach(Consumer<? super E> action) {
action.accept(this.element);
}
public boolean removeIf(Predicate<? super E> filter) {
throw new UnsupportedOperationException();
}
public void replaceAll(UnaryOperator<E> operator) {
throw new UnsupportedOperationException();
}
public void sort(Comparator<? super E> c) {
}
public Spliterator<E> spliterator() {
return Collections.singletonSpliterator(this.element);
}
public int hashCode() {
return 31 + Objects.hashCode(this.element);
}
}
可以发现,此类中并没有重写父类AbstractList的add方法,因此会调用父类AbstractList的add方法。再看看AbstractList的add方法。
public boolean add(E e) {
this.add(this.size(), e);
return true;
}
让我们ctrl继续放下看
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
可以看到父类也并没有实现add操作,而是直接抛出UnsupportedOperationException异常,这就是异常出现的原因了。
3.解决方法:
将List替换为具体实现了add方法的子类,然后就可以愉快的进行添加操作了
List<ArrayList<String>> res = new ArrayList<>();
res.get(temp).add(str);