java.lang.UnsupportedOperationException

一、背景

记录一次小坑…

最近在写一个关于Excel导出的小需求,由于系统都有一些工具类,还有原来已经做好的导出,直接拿过来改了改就用了,没想到直接报错,尴尬。

还是那句话,别人都能用,我复制的,为啥就报错,离了个大谱啊。

关于Excel导出工具,可以参考:
JAVA导出Excel文件:https://blog.csdn.net/qq_38254635/article/details/126691175

二、处理问题

2.1 报错复现

测试demo代码,报错现场复现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Test {public static void main(String[] args) {System.out.println("方法一" + one().toString());System.out.println("方法二" + two().toString());}public static List<String> one(){List<String> list = new ArrayList<>();list.addAll(Arrays.asList("first", "second"));list.add("third");return list;}public static List<String> two(){List<String> list = Arrays.asList("first", "second");list.add("third");return list;}}

不得不说,不运行还真不一定能知道这代码会报错…

在这里插入图片描述

2.2 分析原因

1、先看一下没有报错的方法。

add方法,如下图:
在这里插入图片描述
额,这就很明显了,就是大家都说的,ArrayList的动态扩容,所以不会报错。

不清楚的,可以看一看这个:

ArrayList和LinkedList区别:https://blog.csdn.net/qq_38254635/article/details/121082607

2、再看一下报错的方法。

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at Test.two(Test.java:23)at Test.main(Test.java:11)

点到 AbstractList 类的 108 行,可能还是点懵。

在这里插入图片描述

再看 AbstractList 类的 148 行,我*,无情啊。

在这里插入图片描述

好家伙,这直接给 throw new UnsupportedOperationException(); 这是不让改啊。

只记得动态扩容的好,却忘了这只是ArrayList重写带给我们的便利啊。

2.3 总结

反过来再看一下demo

List<String> list = Arrays.asList("first", "second");

其中得到的 list 并非我们经常所使用的 ArrayList

查看 Arrays.asList 不难发现,得到的是一个内部类,所以并没有对 add()、remove() 进行重写。

也可以从网上搜搜 UnsupportedOperationException 都会有详细的解释。

建议写一个demo,让他报错,然后点进去,看看源码,才能更深入的了解其真实原因。

OK,就这些吧。

有什么不对的还望指正,书写不易,觉得有帮助就点个赞吧!☺☺☺