首页 > 其他分享 >调用ArrayList的add方法抛异常UnsupportedOperationException

调用ArrayList的add方法抛异常UnsupportedOperationException

时间:2024-08-26 23:14:52浏览次数:13  
标签:UnsupportedOperationException java Arrays ArrayList List list2 add

调用ArrayList的add方法抛异常UnsupportedOperationException

对于一些想要把数组转成List的需求,可能会使用到Arrays.asList()获取List对象,但是这里面也存在一些问题。

示例代码如下

    void test1(){
        List<Object> list = Arrays.asList();
        list.add("hello");
    }

执行后报错信息为

java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)
	at com.heima.item.test.test.test1(test.java:15)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
......

在上述代码中,list.add("hello")执行报错,异常为java.lang.UnsupportedOperationException,通过查看Arrays里的asList()方法可以看到如下信息

	@SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

这边是new了一个新的ArrayList对象,有人可能以为这是我们所熟悉的那个ArrayList,但是其实不是,这是【java.util.Arrays.ArrayList】,而我们常用的ArrayList是【java.util.ArrayList】在Arrays的源码里面可以看到压根没有导入我们熟悉的那个ArrayList,而是定义了一个内部类。简单来说这是两个类,只是名字相同了,恰好都是ArrayList

这个内部类是直接继承了AbstractList,它并没有重写add方法,所以我们调了add方法其实是调的AbstractList里的add方法,AbstractList里的add方法源码为

    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

原因很明显,不重写的话一调就抛出异常UnsupportedOperationException。
不止add方法,set,remove这些方法也不能通过Arrays.asList得到的对象调用,具体可以参考Arrays和AbstractList这两个类的源码。

另辟蹊径:

方法一

对于想要通过asList来获取List对象,又想调用add方法的,可以使用下列方式得到java.util.ArrayList对象,没错这正是我们常用的List实例对象。

    void test2(){
        String [] strs = {"AAA", "BBB", "CCC"};
        List<String> list1 = Arrays.asList(strs);

        ArrayList<String> list2 = new ArrayList(list1);
        list2.add("XXX");

        list2.forEach(System.out::println);
    }

通过这种方式,可以正常add元素进入list,遍历打印出来的结果如下

AAA
BBB
CCC
XXX

方法二

避免使用Arrays.asList,而是使用Collections.addAll来帮助我们把数组里的元素全部添加到List对象里。

    void test3(){
        String [] strs = {"AAA", "BBB", "CCC"};
        List<String> list1 = Arrays.asList(strs);

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, strs);

        list2.add("YYY");
        list2.forEach(System.out::println);
    }

遍历打印出来的结果如下

AAA
BBB
CCC
YYY

方法三

遍历复制元素。把java.util.Arrays.ArrayList里的元素遍历,然后一个个添加进入自己创建的java.util.ArrayList实例里。

    void test4(){
        String [] strs = {"AAA", "BBB", "CCC"};
        List<String> list1 = Arrays.asList(strs);

        ArrayList<String> list2 = new ArrayList<>();

        list1.forEach(e -> {
            list2.add(e);
        });

        list2.add("ZZZ");
        list2.forEach(System.out::println);
    }

遍历打印出来的结果如下

AAA
BBB
CCC
ZZZ

方法四

遍历复制元素。把java.util.Arrays.ArrayList里的所有元素一次性添加进入自己创建的java.util.ArrayList实例里。

    void test5(){
        String [] strs = {"AAA", "BBB", "CCC"};
        List<String> list1 = Arrays.asList(strs);

        ArrayList<String> list2 = new ArrayList<>();
        list2.addAll(list1);

        list2.add("OOO");
        list2.forEach(System.out::println);
    }

遍历打印出来的结果如下

AAA
BBB
CCC
OOO

方法五

直接创建java.util.ArrayList对象,使用for循环遍历数组然后add元素。

其他方法

还有一些没有介绍到的方式,比如List.copyOf,Stream API之类等等,最后都能得到想要的对象,但是不够简单。比较推荐使用常见的这几种方式。

标签:UnsupportedOperationException,java,Arrays,ArrayList,List,list2,add
From: https://www.cnblogs.com/huajieyu/p/18381709

相关文章

  • OpenCV(cv::addWeighted()、cv::threshold())
    目录1.cv::addWeighted()函数定义:参数详解:公式:例子:2.cv::threshold()函数定义:参数详解:返回值:例子:3.总结:1.cv::addWeighted()cv::addWeighted()是OpenCV中用于将两幅图像按指定的权重进行加权求和的函数。主要用途包括图像融合、过渡效果生成等。函数定义:voidcv::add......
  • ArrayList遍历, 元素查找
    1,ArrayList集合的遍历与数组类似,都可以使用foreach语句string[]str1={"a","b","c","d","e","f"};ArrayListList=newArrayList(str1);foreach(variteminList)......
  • ArrayList元素的删除(4种函数)
    1Clear()方法Clear()方法用来从ArrayList中移除所有元素,语法格式如下。string[]str1={"a","b","c"};ArrayListList=newArrayList(str1);List.Clear();2Remove()方法Remove()方法用来从ArrayList中移除特定对象的第一个......
  • ArrayList声明,Add(), Insert();
     ArrayList提供了3个构造器,通过这3个构造器可以有3种声明方式。(1)默认构造器,会以默认大小(16位)初始化内部数组。构造器格式如下。ArrayListList=newArrayList();//实例化一个ArrayList,命名为List;for(inti=0;i<10;i++)//添加10个元素......
  • gameobject_template | gameobject_template_addon
    目录gameobject_templateentrytypedisplayIdIconNameContentTuningIdAINamegameobject_template_addon factionflagsgameobject_templateentry gameobject模板的IDtype gameobject模板类型,取值参考源码GameObjectData.h的structGameObjectTemplat......
  • ArrayList动态扩容机制(长度可变原理)
    ArrayList底层是数组结构的,数组的默认长度为10。当数组添加满了后,会自动扩容为1.5倍。原理讲解:1.用空参构造函数创建ArrayList集合容器。测试代码:publicclassArrayListDemo{publicstaticvoidmain(String[]args){//创建ArrayList集合容器......
  • LeetCode 2952. Minimum Number of Coins to be Added
    原题链接在这里:https://leetcode.com/problems/minimum-number-of-coins-to-be-added/description/题目:Youaregivena 0-indexed integerarray coins,representingthevaluesofthecoinsavailable,andaninteger target.Aninteger x is obtainable ifthere......
  • [数字人、虚拟人、PaddleBoBo、深度学习框架、PaddleSpeech、PaddleGAN、虚拟主播]踩
    注意:使用gpu版的paddlepaddle,cpu版的生成视屏动不动几个小时,让人怀疑人生飞浆网址:飞桨AIStudio星河社区-人工智能学习与实训社区(baidu.com)一:使用conda创建虚拟环境:python3.7.4condacreate--namepy374python=3.7.4二:安装paddlepaddle2.2.2我的电脑目前c......
  • 深入理解 Java 中 ArrayList 的底层原理
    在这篇博客中,我们将深入探讨ArrayList的底层实现原理,并通过逐步剖析ArrayList的源码来理解其内部工作机制。我们将重点关注ArrayList的创建、元素添加、扩容机制等关键点。创建ArrayList集合对象ArrayList<String>list=newArrayList<>();使用空参构造器创建ArrayList集合......
  • InetAddress类的使用
    packagecom.shujia.day20;importjava.net.InetAddress;/*InetAddress:是用来描述IP地址的此类表示Internet协议(IP)地址。IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议。IP地址结构由定义RFC790:AssignedNumbers,RFC1918:......