java返回的List进行add操作报错

 更新时间:2023年06月09日 08:33:05   作者:以范特西之名  
本文主要介绍了java返回的List进行add操作报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

为什么返回的List进行add操作竟然报错?

public class Test {
​
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        list.add(5);
    }
}

image-20230605101345263.png

这一瞬间我开始相信了玄学,清idea缓存、重启项目、重启系统。竟然还是不行,又一个开发开始怀疑人生了....

短暂失意后,秉着科学严谨的态度,开始看起了源码。

首先我们看起了这个异常是什么意思。

image-20230605101600869.png

Thrown to indicate that the requested operation is not supported.表示不支持这个操作,为什么add操作会不支持呢?

我们查看这个Arrays.asList()方法

image-20230605101808308.png

这里是返回了一个ArrayList对象。ArrayList对象为啥不能add操作,感觉自己的体系开始崩塌。怀疑自己之前用的是什么。为了验证我们继续点击这个ArrayList。

image-20230605102040896.png

瞬间恍然大悟,原来这个ArrayList并不是我们之前用的java.util.ArrayList而是java.util.Arrays.ArrayList是Arrays下的一个内部类。它通用继承了AbstractList但是没有重写add方法只是实现了其他的方法,所以add就会抛出异常UnsupportedOperationException

image-20230605102427127.png

image-20230605102443006.png

当子类实例指向父类引用时,是子类决定了父类引用调用谁的成员方法。

如果子类重写了父类的方法,父类引用会优先调用子类重写的方法如果子类没有重写父类的方法,父类引用会调用自己的方法 当子类实例指向子类引用时,子类引用优先调用子类的方法,如果子类没有此方法,则会调用父类的方法

由于它继承了AbstractList,AbstractList实现了List。所以可以用List来接收,又因为返回的实例对象又名叫ArrayList,但此ArrayList又非彼ArrayList,所以会让我们误解迷惑。

同样的例子还有Collections.emptyList();它返回的是一个java.util.Collections.EmptyList对象。该对象同样没有实现add方法。

image-20230605103157952.png

同样该类的EmptySetEmptyList也是没有实现相关的添加操作方法。

结论

返回的List实例对象并不是我们所认为的ArrayList对象。该对象是一个内部类并没有提供add方法。需要返回一个可以add操作的List方法时要慎用此类方法。如果只是遍历获取可以使用。

到此这篇关于java返回的List进行add操作报错的文章就介绍到这了,更多相关java返回List操作 add内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java RabbitMQ的持久化和发布确认详解

    Java RabbitMQ的持久化和发布确认详解

    这篇文章主要为大家详细介绍了RabbitMQ的持久化和发布确认,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java基础学习之ArrayList类概述与常用方法

    Java基础学习之ArrayList类概述与常用方法

    这篇文章主要为大家简单的介绍Java中ArrayList类的概述、常用方法及存储字符串并遍历,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • Java中的HashMap源码分析

    Java中的HashMap源码分析

    这篇文章主要介绍了Java中的HashMap源码分析,散列表是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,需要的朋友可以参考下
    2023-09-09
  • 详解Spring Boot使用系统参数表提升系统的灵活性

    详解Spring Boot使用系统参数表提升系统的灵活性

    Spring Boot项目中常有一些相对稳定的参数设置项,其作用范围是系统级的或模块级的,这些参数称为系统参数。这些变量以参数形式进行配置,从而提高变动和扩展的灵活性,保持代码的稳定性
    2021-06-06
  • java实现抽奖功能解析

    java实现抽奖功能解析

    这篇文章主要为大家详细介绍了java实现抽奖功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Java替换int数组中重复数据的方法示例

    Java替换int数组中重复数据的方法示例

    这篇文章主要介绍了Java替换int数组中重复数据的方法,涉及java针对数组的遍历、转换、判断等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 详解SpringBoot中添加@ResponseBody注解会发生什么

    详解SpringBoot中添加@ResponseBody注解会发生什么

    这篇文章主要介绍了详解SpringBoot中添加@ResponseBody注解会发生什么,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java获取到heapdump文件后快速分析技巧

    java获取到heapdump文件后快速分析技巧

    大家都知道HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件,今天通过本文给大家介绍java获取到heapdump文件后,如何快速分析,需要的朋友可以参考下
    2023-04-04
  • java 连接Redis的小例子

    java 连接Redis的小例子

    这篇文章介绍了java 连接Redis的小例子,有需要的朋友可以参考一下
    2013-09-09
  • java中lambda表达式的分析与具体用法

    java中lambda表达式的分析与具体用法

    这篇文章主要给大家介绍了关于java中lambda表达式具体用法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论