Arrays.asList()新增报错,该怎么解决
一、前言
在 Java 开发中,Arrays.asList() 是一个常用的工具方法,它允许开发者快速将数组转换为列表。尽管这个方法非常方便,但许多开发者在使用时可能会遭遇一个常见的错误:尝试向由 Arrays.asList() 返回的列表中添加元素时抛出异常。本文将详细探讨这个现象的根本原因,并提供相关的使用示例和解决方案。。
二、事故回顾
这个问题是出现开发一个电商平台的订单系统时,遇到了类似的问题。需要将一个订单ID数组转换为一个List,并在后续的业务逻辑中向这个List中添加新的订单ID。
由于小伙伴经验不足,使用了Arrays.asList()方法,部署到线上导致在添加新订单ID时抛出了UnsupportedOperationException异常,整个订单处理流程中断,线上系统出现了严重的故障。
影响分析
这次事故对电商平台造成了巨大的影响:
- 用户体验下降: 由于订单处理流程中断,用户无法正常下单,导致用户体验大幅下降。
- 业务中断: 订单系统的故障直接影响到了整个电商平台的业务运营,造成了大量的订单积压。
- 经济损失: 由于业务中断,平台失去了大量的潜在收入,给公司带来了不小的经济损失。
- 信任危机: 频繁的系统故障让用户对平台的信任度下降,可能导致用户流失。
后面也是及时修复,吸取本次事故教训。
三、事故问题描述
1、首先先简单描述一下这个事故问题,废话不多说,直接看实际业务代码,也就将一个数组转换为List,并对这个List进行增删操作。
Integer[] arr = {1, 2};List<Integer> list = Arrays.asList(arr);list.add(3);
上述代码看起来,没问题,编译器也没有报错。但是运行这段代码时,会抛出UnsupportedOperationException异常,提示我们不支持添加操作。这究竟是怎么回事呢?
所以这是不是个大坑,如果在实际开发中没有进行自测,必定不会酿成重大线上事故。
四、问题分析
上述已经知道这个使用Arrays.asList()将数组装换成List会在add情况会报错,接下来深入源码进行分析。
Arrays.asList()的内部实现
Arrays.asList(arr)方法实际上返回的是一个Arrays类的内部类ArrayList,而不是我们常用的java.util.ArrayList。这个内部类ArrayList继承自AbstractList,并没有实现add和remove方法。
Arrays类的内部类ArrayList完整源码如下:
private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable
{private static final long serialVersionUID = -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}@Overridepublic int size() {return a.length;}@Overridepublic Object[] toArray() {return a.clone();}@Override@SuppressWarnings("unchecked")public <T> T[] toArray(T[] a) {int size = size();if (a.length < size)return Arrays.copyOf(this.a, size,(Class<? extends T[]>) a.getClass());System.arraycopy(this.a, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}@Overridepublic E get(int index) {return a[index];}@Overridepublic E set(int index, E element) {E oldValue = a[index];a[index] = element;return oldValue;}@Overridepublic int indexOf(Object o) {E[] a = this.a;if (o == null) {for (int i = 0; i < a.length; i++)if (a[i] == null)return i;} else {for (int i = 0; i < a.length; i++)if (o.equals(a[i]))return i;}return -1;}@Overridepublic boolean contains(Object o) {return indexOf(o) != -1;}@Overridepublic Spliterator<E> spliterator() {return Spliterators.spliterator(a, Spliterator.ORDERED);}@Overridepublic void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);for (E e : a) {action.accept(e);}}@Overridepublic void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);E[] a = this.a;for (int i = 0; i < a.length; i++) {a[i] = operator.apply(a[i]);}}@Overridepublic void sort(Comparator<? super E> c) {Arrays.sort(a, c);}
}
可以看到并没有实现add和remove方法,这两个方法在父类中,默认抛出UnsupportedOperationException异常。
具体原因
下面是内部源码的分析
1.内部类ArrayList的限制:
Arrays.asList(arr)返回的内部类ArrayList是一个固定长度的列表,它没有实现add和remove方法。
当我们调用list.add(3)时,实际上调用的是AbstractList中的add方法,而这个方法直接抛出了UnsupportedOperationException异常。
2.源码分析:
AbstractList的add方法如下:
五、解决方案
面对这一限制,开发者可以采取以下几种方式来处理 Arrays.asList() 返回的列表:
1、使用 new ArrayList<>() 创建可变列表
如果需要一个可变大小的列表,可以使用 new ArrayList<>(Arrays.asList(fruits)) 进行转换: 这种方式创建了一个新的 ArrayList 实例,它的大小是可变的,因此可以自由添加、删除元素。
List<String> dynamicList = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));dynamicList.add("Date"); // 现在可以成功添加元素System.out.println(dynamicList);
2、直接初始化 ArrayList
另一种选择是直接使用 ArrayList 的构造函数,并传入数组元素: 这种方法提供了更大的灵活性,适合需要动态修改的场景。
List<String> dynamicList = new ArrayList<>();Collections.addAll(dynamicList, "Apple", "Banana", "Cherry");dynamicList.add("Date"); // 添加成功
3、使用流(Streams)
在 Java 8 及更高版本中,可以利用流的 API 来创建可变列表: 这种方法简洁而现代化,适合喜欢函数式编程风格的开发者。
List<String> dynamicList = Stream.of("Apple", "Banana", "Cherry").collect(Collectors.toList());dynamicList.add("Date"); // 添加成功
转载:小哈学Java
相关文章:
Arrays.asList()新增报错,该怎么解决
一、前言 在 Java 开发中,Arrays.asList() 是一个常用的工具方法,它允许开发者快速将数组转换为列表。尽管这个方法非常方便,但许多开发者在使用时可能会遭遇一个常见的错误:尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...
28.UE5实现对话系统
目录 1.对话结构的设计(重点) 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图,也就是下图中的…...
会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
11月26日,2024紫光展锐全球合作伙伴大会在上海举办,作为紫光展锐年度盛会,吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年,共同面向5G、AI和卫星通信为代表的前沿科技,聚焦技术…...
IDEA报错: java: JPS incremental annotation processing is disabled 解决
起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错,信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…...
面对深度伪造:OWASP发布专业应对指南
从美国大选造谣视频到AI编写的网络钓鱼邮件,深度伪造(deepfake)诈骗和生成式人工智能攻击日益猖獗,人眼越来越难以辨识,企业迫切需要为网络安全团队制定AI安全事件响应指南。 深度伪造攻击威胁日益增加 全球范围内&…...
IDEA全局设置-解决maven加载过慢的问题
一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…...
【阅读笔记】Android广播的处理流程
关于Android的解析,有很多优质内容,看了后记录一下阅读笔记,也是一种有意义的事情, 今天就看看“那个写代码的”这位大佬关于广播的梳理, https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…...
queue 和 Stack
import scala.collection.mutable //queue:队列.排队打饭.... //特点:先进先出 //Stack:栈 //特点:先进后出 class ob5 { def main(args: Array[String]): Unit { val q1 mutable.Queue(1) q1.enqueue(2)//入队 q1.enqueue(3)//入队 q1.enqueue(4)…...
C#窗体小程序计算器
使其能完成2个数的加、减、乘、除基本运算。界面如下图,单击相应的运算符按钮,则完成相应的运算,并将结果显示出来,同时不允许在结果栏中输入内容 代码如下: private void button1_Click(object sender, EventArgs e)…...
Linux——自定义简单shell
shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …...
大模型开发和微调工具Llama-Factory-->WebUI
WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内, # USE_MODELSCOPE_HUB 设为 1,表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…...
【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理
主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …...
基于LSTM的文本多分类任务
概述: LSTM(Long Short-Term Memory,长短时记忆)模型是一种特殊的循环神经网络(RNN)架构,由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…...
Git忽略文件
在Git中,你可以通过修改 .gitignore 文件来忽略整个文件夹。以下是具体步骤: 打开或创建 .gitignore 文件 确保你的项目根目录下有一个 .gitignore 文件。如果没有,创建一个: touch .gitignore 在 .gitignore 文件中添加要忽略…...
Spring的事务管理
tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用,用于管理事务的生命周期。propagation指定事务的传播属性,决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别,用于控制事务之…...
java int值可以直接赋值给char类型 详解
在 Java 中,int 值可以直接赋值给 char 类型,但有一定的限制和机制。以下是详细的解释: 1. Java 中的 char 和 int 类型关系 char 的本质 char 是一个 16 位无符号整数类型,用于表示 Unicode 字符。范围为 0 到 65535࿰…...
淘宝商品数据获取:Python爬虫技术的应用与实践
引言 随着电子商务的蓬勃发展,淘宝作为中国最大的电商平台之一,拥有海量的商品数据。这些数据对于市场分析、消费者行为研究、商品推荐系统等领域具有极高的价值。然而,如何高效、合法地从淘宝平台获取这些数据,成为了一个技术挑…...
【力扣】389.找不同
问题描述 思路解析 只有小写字母,这种设计参数小的,直接桶排序我最开始的想法是使用两个不同的数组,分别存入他们单个字符转换后的值,然后比较是否相同。也确实通过了 看了题解后,发现可以优化,首先因为t相…...
何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...
pnpm安装electron出现postinstall$ node install.js报错
pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法,添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…...
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件 在使用 Hugging Face 的数据集进行模型训练时,有时我们并不需要整个数据集,尤其是当数据集非常大时。为了节省存储空间和提高训练效率,我们可以从数据集中随机采样一部分数…...
Rook入门:打造云原生Ceph存储的全面学习路径(上)
文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.2 获取rook最新版本3.3 rook资源文件目录结构3.4 部署Rook/CRD/Ceph集群3.5 查看rook部…...
AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...
计算机网络(三)
一个IP包,其数据长度为4900字节,通过一个MTU为1220字节的网络时,路由器的分片情况如何?请用图表的形式表示出路由器分片情况。 已知 IP 包的数据长度为 4900 字节,IP 首部长度通常为 20 字节,所以整个 IP …...
去哪儿Android面试题及参考答案
TCP 的三次握手与四次挥手过程是什么? TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 ,三次握手和四次挥手是其建立连接和断开连接的重要过程。 三次握手过程 第一次握手:客户端向服务器发送一个 SYN(同步序列号)包,其中包…...
探索温度计的数字化设计:一个可视化温度数据的Web图表案例
随着科技的发展,数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面,传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表,该图表通过动态数据可视化展示了温度值,并通过渐变色…...
JS API事件监听(绑定)
事件监听 语法 元素对象.addEventListener(事件监听,要执行的函数) 事件监听三要素 事件源:那个dom元素被事件触发了,要获取dom元素 事件类型:用说明方式触发,比如鼠标单击click、鼠标经过mouseover等 事件调用的函数&#x…...
【k8s】kube-state-metrics 和 metrics-server
kube-state-metrics 和 metrics-server 是 Kubernetes 生态系统中两个重要的监控组件,但它们的功能和用途有所不同。下面是对这两个组件的详细介绍: kube-state-metrics 功能: kube-state-metrics 是一个简单的服务,它监听 Kub…...
Linux设置开启启动脚本
1.问题 每次启动虚拟机需要手动启动网络,不然没有enss33选项 需要启动 /mnt/hgfs/dft_shared/init_env/initaial_env.sh 文件 2.解决方案 2.1 修改/etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要…...
数据结构-图(一)
文章目录 图一、图的基本概念(一)图的定义(二)有向图与无向图(三)顶点的度、入度与出度(四)路径、回路与连通图 二、图的存储及基本操作(一)邻接矩阵…...
SQL面试题——抖音SQL面试题 最近一笔有效订单
最近一笔有效订单 题目背景如下,现有订单表order,包含订单ID,订单时间,下单用户,当前订单是否有效 +---------+----------------------+----------+-----------+ | ord_id | ord_time | user_id | is_valid | +---------+----------------------+--------…...
【人工智能基础05】决策树模型
文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益(ID3 算法)信息增益比(C4.5 算法)基尼指数(CART 算法)举例说明:计算各个…...
远程桌面协助控制软件 RustDesk v1.3.3 多语言中文版
RustDesk 是一款开源的远程桌面软件,支持多平台操作,包括Windows、macOS、Linux、iOS、Android和Web。它提供端到端加密和基于角色的访问控制,确保安全性和隐私保护。使用简单,无需复杂配置,通过输入ID和密码即可快速连…...
git的学习笔记
一,git的安装 mac电脑的安装 xcode-select --install windows安装,用指令麻烦一些 随便找个视频观看看教程,去官网下载就可以了。 centos安装 sudo yum install git -y ubuntu安装 sudo apt-get install git -y 查看git安装的版本 git --ver…...
【目标检测】YOLO:深度挖掘YOLO的性能指标。
YOLO 性能指标 1、物体检测指标2、性能评估指标详解2.1 平均精度(mAP)2.2 每秒帧数(FPS)2.3 交并比(IoU)2.4 混淆矩阵(Confusion Matrix)2.5 F1-Score2.6 PR曲线(Precisi…...
第一届帕鲁杯”应急响应“解析-上部分
这个帕鲁杯是一个模拟真实生产场景的应急响应题目,这个具有拓扑网络结构,考察综合能力以及对各个系统的应急响应 网络拓扑结构图如下 相关的资产情况如下 mysql01:10.66.1.10mysql02:10.66.1.11PC01:10.66.1.12PC02…...
前端http,ws拉流播放视频
可以在西瓜播放器官网APi调试拉取的视频流是否可以播放 类似http拉流地址为:http://localhost:8866/live?urlrtsp://admin:admin123192.168.11.50:554/cam/realmonitor?channel1&subtype01 <!DOCTYPE html> <html><head><meta charset…...
揭开广告引擎的神秘面纱:如何在0.1秒内精准匹配用户需求?
目录 一、广告系统与广告引擎介绍 (一)广告系统与广告粗分 (二)广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 (一)一般概述 (二)核心功能架构图 三、标…...
【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)
目录💻 前言**Docker Compose介绍**最终实现效果 一、搭建集群1、创建文件结构2、创建redis节点3、验证节点4、创建sentinel哨兵5、验证Sentinel功能 二、spring连接1、添加依赖2、添加配置3、启动测试 三、直接部署流程1、拉取配置2、修改端口创建 前言 本篇文章主…...
Spring WebFlux与Spring MVC
Spring WebFlux 是对 Spring Boot 项目中传统 Spring MVC 部分的一种替代选择,主要是为了解决现代 Web 应用在高并发和低延迟场景下的性能瓶颈。 1.WebFlux 是对 Spring MVC 的替代 架构替代: Spring MVC 使用的是基于 Servlet 规范的阻塞式模型…...
江协科技最新OLED保姆级移植hal库
江协科技最新OLED移植到hal库保姆级步骤 源码工程存档 工程和源码下载(密码 1i8y) 原因 江协科技的开源OLED封装的非常完美, 可以满足我们日常的大部分开发, 如果可以用在hal库 ,将是如虎添翼, 为我们开发调试又增加一个新的瑞士军刀, 所以我们接下来手把手的去官网移植源码…...
Vue框架开发一个简单的购物车(Vue.js)
让我们利用所学知识来开发一个简单的购物车 (记得暴露属性和方法!!!) 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…...
探索嵌入式硬件设计:揭秘智能设备的心脏
目录 引言 嵌入式系统简介 嵌入式硬件设计的组成部分 设计流程 微控制器选择 原理图设计 PCB布局 编程与调试 系统集成与测试 深入理解微控制器 存储器管理 输入/输出接口 通信接口 电源管理 硬件抽象层(HAL) 操作系统(OS&am…...
逆向攻防世界CTF系列42-reverse_re3
逆向攻防世界CTF系列42-reverse_re3 参考:CTF-reverse-reverse_re3(全网最详细wp,超4000字有效解析)_ctfreverse题目-CSDN博客 64位无壳 _int64 __fastcall main(__int64 a1, char **a2, char **a3) {int v4; // [rsp4h] [rbp-…...
AIGC时代 | 如何从零开始学网页设计及3D编程
文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的Unity 3D游戏 《编程真好玩:从零开始学网页设计及3D编程》内容简介作者简介…...
EMall实践DDD模拟电商系统总结
目录 一、事件风暴 二、系统用例 三、领域上下文 四、架构设计 (一)六边形架构 (二)系统分层 五、系统实现 (一)项目结构 (二)提交订单功能实现 (三࿰…...
基于多VSG独立微网的多目标二次控制MATLAB仿真模型
“电气仔推送”获得资料(专享优惠) 模型简介 本文将一致性算法引入微电网的二次频率和电压控制,自适应调节功率参考值和补偿电压,同时实现频率电压恢复、有功 无功功率的比例均分以及功率振荡抑制,提高系统的暂态和稳…...
自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析
前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间,…...
nginx 代理 web service 提供 soap + xml 服务
nginx 代理 web service 提供 soap xml 服务 最关键的配置: # Nginx默认反向后的端口为80,因此存在被代理后的端口为80的问题,这就导致访问出错。主要原因在Nginx的配置文件的host配置时没有设置响应的端口。Host配置只有host,没有对应的p…...
深入理解 MongoDB:一款灵活高效的 NoSQL 数据库
在现代应用程序开发中,数据存储技术已经从传统的关系型数据库(RDBMS)扩展到多样化的 NoSQL 数据库。MongoDB 作为一款广泛使用的文档型数据库,以其灵活性、高性能和易用性成为开发者的首选之一。本篇博文将从 MongoDB 的核心概念、…...