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;
    }

}

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

java.lang.UnsupportedOperationException_第1张图片

2.2 分析原因

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

add方法,如下图:
java.lang.UnsupportedOperationException_第2张图片
额,这就很明显了,就是大家都说的,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 行,可能还是点懵。

java.lang.UnsupportedOperationException_第3张图片

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

java.lang.UnsupportedOperationException_第4张图片

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

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

2.3 总结

反过来再看一下demo

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

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

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

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

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

OK,就这些吧。

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

你可能感兴趣的:(工作总结,java,windows,开发语言,spring,boot)