假ArrayList导致的线上事故......
假ArrayList导致的线上事故…
线上事故回顾
- 晚饭时,当我正沉迷于排骨煲肉质鲜嫩,汤汁浓郁时,产研沟通群内发出一条消息,显示用户存在可用劵,但进去劵列表却什么也没有,并附含了一个视频。于是我一边吃了排骨,一边查看消息点开了视频,en~,视频跟描述一样。但没有系统告警,用户界面也没有明显的报错提示,怀疑是小部分特殊情况导致的,查看消息后几秒,我直接被@来处理问题,擦,只好把外卖盒重新盖好,先去处理问题。
处理经过
-
通过群内产品发的用户邮箱查到了用户id,再根据接口的相关日志结合uid在日志平台进行关联查询,查到日志后,再拿到traceId进行链路查询,果不其然,发现了异常日志,如下部分日志所示
-
java.lang.UnsupportedOperationException: nullat java.util.AbstractList.add(AbstractList.java:148) ~[na:1.8.0_151]at java.util.AbstractList.add(AbstractList.java:108) ~[na:1.8.0_151] -
这
UnsupportedOperationException是个什么玩意 -
@Slf4j @SpringBootTest public class Demo {public void test(Context context) { context.getList().add("皮皮虾");}}@Data class Context {private List<String> list;} -
基本操作就是拿到上下文中的List,然后再add一个元素
-
讲道理,add操作是不会有问题的,有问题的还得是List,追根溯源,让我康康这个List是怎么来的于是我一顿狂点,来到了set这个list的位置
-
@Slf4j @SpringBootTest public class Demo {public void test(Context context) {context.setList(Arrays.asList("皮皮虾"));}}@Data class Context {private List<String> list;} -
context.setList(Arrays.asList("Code皮皮虾"));这行看起来好像没问题啊Arrays.asList(T... a)我们平时也会用,传入一个数组,返回出一个List没啥问题呀 -
那我再试试
add方法 ,擦,问题复现了,还真是Arrays.asList(T... a)生成的List的add方法报错,由于线上存在问题,则先修改为以下代码上线,也就是修改为我们平时正常的写法, 上线后,观察了下日志,群里回复已解决问题,也让用户重试,发现没问题,自此问题解决。
追根溯源
-
进入
asList方法,发现底层new了一个ArrayList,并将数组传入作为List的元素 -
@SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) {return new ArrayList<>(a); } -
emm,看起来很简单啊,没问题啊,咋会报错呢?别着急,咱们在点开这个
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);}// ... 省略 } -
擦,这
ArrayList是Arrays类的一个静态内部类,不是我们经常用的java.util.ArrayList继续看,这个静态内部类ArrayList继承了AbstractList,而且默认是没有实现add方法的.也就是说调用add方法会直接调用父类,也就是AbstractList的add方法,源码点开一看,真相大白了.AbstractList的add方法直接抛出UnsupportedOperationException异常,跟线上报错一模一样!!
相关文章:
假ArrayList导致的线上事故......
假ArrayList导致的线上事故… 线上事故回顾 晚饭时,当我正沉迷于排骨煲肉质鲜嫩,汤汁浓郁时,产研沟通群内发出一条消息,显示用户存在可用劵,但进去劵列表却什么也没有,并附含了一个视频。于是我一边吃了排…...
K8S精进之路-控制器Deployment-(1)
在K8S中,最小运行单位为POD,它是一个逻辑概念,其实是一组共享了某些资源的容器组。POD是能运行多个容器的,Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume。在POD中能够hold住网络…...
flutter iOS 视频mov格式转MP4格式
flutter iOS 视频mov格式转MP4格式 前言一、使用video_compress压缩视频总结 前言 今天在写项目的时候,突然发现iOS 里面的有些视频格式是mov的格式,这就导致在视频播放组件无法播放的问题,期间试过替换视频格式,但是又不想存储文…...
datafilecopy header validation failure for file +DATA/orcl/datafile/file1.ora
环境 linux 6.8 oracle 11.2.0.4 rac 未打补丁 现象: 数据库日志中显示 datafilecopy header validation failure for file DATA/orcl/datafile/file1.ora原因 用rman的backup as copy 对数据文件进行了copy或者叫位置更改时候,在sqlplus中对文件名进行…...
[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应
目录 前言: 一、道家的核心思想 二、恒者恒强,弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言: 马太效应和强弱互转的道家思想,都反应了自然规律和社会规律&…...
CentOS用nginx搭建文件下载服务器
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动。在工作中,我们经常会用到需要搭建文件服务器的情况,这里就以在linux下搭…...
Ubuntu下载离线安装包
旧版Ubuntu下载地址 https://old-releases.ubuntu.com/releases/ 下载离线包 sudo apt-get --download-only -odir::cache/ncayu install net-tools下载snmp离线安装包 sudo apt-get --download-only -odir::cache/root/snmp install snmp snmpd snmp-mibs-downloadersudo a…...
【UE】线框材质
一、方式1 新建一个材质,混合模式设置为“已遮罩”,勾选“双面” 勾选“线框” 然后可以随便给一个自发光颜色,这样最基本的线框材质就完成了 二、方式2 新建一个材质,混合模式设置为“已遮罩”,勾选“双面”&#x…...
物联网网关在工业行业的应用与优势
物联网网关在工业行业的应用与优势 随着科技的发展,物联网(IoT)在各个行业得到了广泛应用。工业行业是其中的一个重要领域。工业行业涉及到许多生产和运输环节,需要不断地监测和控制各个环节的数据和参数。物联网网关(…...
【excel技巧】单元格内的公式如何隐藏?
Excel文件中最重要的除了数据还有就是一些公式了,但是只要点击单元格,公式就能显示出来,如果不想别人看到公式应该如何设置呢?今天分享隐藏excel单元格数据的方法。 选中单元格,点击右键打开【设置单元格格式】&#x…...
展开语法、剩余语法
展开语法定义 展开语法Spread Syntax,可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;还可以在构造字面量对象时,将对象表达式按照key-value的方式展开。(字面量一般指[1, 2, 3]或者{name:"md…...
MongoDB归并连续号段-(待验证)
实现按照不同条件归并连续号段的方式与具体的数据模型和查询需求有关,以下是一种常见的方式: 假设有一个文档集合,包含如下字段: {"_id": ObjectId("613c3050d5d9b45a0de7c290"),"group": "…...
【每日一题】设计循环队列(C语言)
循环队列是我们可以对队列有更深一步的理解的题目,而且可以进一步加强其他方面的知识(例如对循环数组的取模运算,指针的解引用),是个蛮不错的巩固习题,话不多说,进入正题。 链接在此࿱…...
logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走
背景: 插件:logicFlow 用途:画流程图 bug表现: 初始化的样子: bug的样子: 拖动第一个节点的时候,一切正常(无论哪个节点作为第一个节点,都是正常的,但是拖动…...
el-tree结合el-switch实现状态切换
<template><div><el-col :span"24"><el-card class"tree-card"><div class"sketch_content selectFile"><span class"span_title">组织列表 </span><div style"display: flex; jus…...
汽车智能座舱/智能驾驶SOC -1
看到华为&小康的 AITO问界M6、M7各种广告营销、宣传、测评、好评如潮水般席卷网络各APP平台。翻看了中信和海通对特斯拉M3和比亚迪元的拆解报告,也好奇华为的汽车芯片平台又能做出哪些新花样,下面是Mark开头,也学习下智能座舱和智能驾驶芯…...
2023 年爆肝将近 20 万字讲解最新 JavaEE 全栈工程师基础教程(更新中)
1. Java 语言基本概述 Java 是一种广泛使用的编程语言,由 James Gosling 在 Sun Microsystems(现在是 Oracle Corporation 的一部分)于 1995 年发表。Java 是一种静态类型的、类基础的、并发性的、面向对象的编程语言。Java 广泛应用于企业级…...
目标检测YOLO实战应用案例100讲-基于改进YOLOv5s的道路目标检测(续)
目录 3.3融合注意力模块 3.3.1注意力机制 3.3.2 SENet 3.3.3 CBAM 3.3.4ECA 3.3.5改进后的算法网络结构...
Laravel/Lumen 任务调度简易入门说明
前提 Laravel 中任务调度简化了服务器系统中 Cron 的操作,使得 计划任务 的实现更为简便。 这里主要以 Laravel 自带的消息队列进行说明,了解其间运行关系可以让我们更清晰的进行代码实现。 下方代码以 Lumen 9.x 框架进行举例,与 Laravel…...
目标检测 详解SSD原理,数据处理与复现
原理详解 前言 今天我们要读的这篇VGGNet(《Very Deep Convolutional Networks For Large-Scale Image Recognition》),就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军,相比于AlexNet&am…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
