一、背景
记录一次小坑…
最近在写一个关于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.UnsupportedOperationException
at 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,就这些吧。
有什么不对的还望指正,书写不易,觉得有帮助就点个赞吧!☺☺☺