List.get().add()报错 UnsupportedOperationException

1 篇文章 0 订阅
1 篇文章 0 订阅

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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值