美文网首页
操作List报java.lang.UnsupportedOper

操作List报java.lang.UnsupportedOper

作者: HurryYu_YZH | 来源:发表于2018-03-12 16:52 被阅读0次

问题描述

今天在项目中调用List的add(..)方法时,程序报了java.lang.UnsupportedOperationException,这个List并非是List list = new ArrayList()而来,而是用Arrays.asList(..)得到的:

List<String> list = Arrays.asList("test1", "test2", "test3");
list.add("test4");

运行结果:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at Main.main(Main.java:8)

原因分析

跟进到asList(..)方法的源码中:

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
}

坑就在这里,它返回的这个ArrayList并不是java.util.ArrayList<E>,而是java.util.Arrays的内部类。


这两个ArrayList都继承自AbstractList<E>,跟进到AbstractList<E>里面看源码:
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

可以看出父类中的set,add,remove方法都是直接抛出UnsupportedOperationException,再回到Arrays的内部类ArrayList,并没有去重写上述方法,因此使用List.asList(..)返回的Arrays内部类ArrayList对象进行add等操作时会抛此异常。再看java.util.ArrayList<E>中,都是对上诉方法进行了重写,因此通过new ArrayList()得到的List进行add等操作,不会有问题。


解决方法

很简单:

List<String> list = new ArrayList<>(Arrays.asList("test1", "test2", "test3"));
list.add("test4");

相关文章

  • 操作List报java.lang.UnsupportedOper

    问题描述 今天在项目中调用List的add(..)方法时,程序报了java.lang.UnsupportedOpe...

  • python使用

    一、list中的每个元素都进行小操作 list = list(map(小操作,list名字)) newList =...

  • php redis list

    list add list 查找 list 删除 list 修改 list 阻塞操作

  • Python学习笔记(四)

    List# List 集合操作 List method that modify the list: List me...

  • 04-Redis 操作之List操作

    Redis 操作之List操作 List操作,redis中的List在在内存中按照一个name对应一个List来存...

  • ArrayList 迭代器 遍历 删除

    ArrayList遍历下标 迭代器遍历list的时候,操作iter可以,不能操作list

  • Python基础-day06

    list ​ 字符串操作 ​ 字典操作 ​ list操作 字符串操作 编码解码 计算机存储数据使用的是...

  • List操作

    List:列表操作 一、列表解析 二、二维List转换成一维List 三、列表排序 四、一维List转换成二维Li...

  • List操作

    1.创建List 2.Append:末尾添加元素 添加单个元素 添加List元素 3.Extend:将List元素...

  • list 操作

    1.根据list中某个对象元素里面某个属性为null进行筛选去除

网友评论

      本文标题:操作List报java.lang.UnsupportedOper

      本文链接:https://www.haomeiwen.com/subject/ueonfftx.html