“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
删除集合元素的时候,报java.lang.UnsupportedOperationException的错误/(ㄒoㄒ)/~~
问题描述
String[] split = str.split("-");
List<String> strs = Arrays.asList(split);
strs.remove(0);
java.lang.UnsupportedOperationException: null
at java.util.AbstractList.remove(AbstractList.java:161) ~[?:1.8.0_241]
将数组通过ArrayList.asList()方法转换为list,执行remove方法的时候报错了。
问题分析
一开始以为是我的删除方式有问题,后来尝试for循环和iterator遍历的方式还是报错。在网上搜了搜才发现,数组转换集合的方式用错了,踩了个大坑╮(╯▽╰)╭。
通过Arrays.asList(split)方式,将数组转换成list后,不能对list进行增删的操作,只能查改,否则就会抛出上述异常。
而Arrays.asList(split)返回值是java.util.Arrays类中一个私有的静态内部类java.util.Arrays.ArrayList,它并非ava.util.ArrayList类。
源码如下:
java.util.Arrays.ArrayList类具有set()、get()、contains()等方法,但是不具有add()和remove()方法,所以调用的时候会报错。 Arrays.asList(strArray)仅适用于将数组转换成list,只对其进行查询操作。 Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法。AbstractList中是默认抛出throw UnsupportedOperationException异常而且不作任何操作。java.util.ArrayList重写了这些方法而Arrays的内部类ArrayList并没有重写,所以会抛出异常。
解决方法
可以采用集合工具类Collection.addAll()方法,根据数组的长度创建一个新的长度相同的list,然后通过Collections.addAll()的方法,将数组中的内容添加到list中。
String[] split = key.split("-");
List<String> strs = new ArrayList<>(split.length);
Collections.addAll(strs,split);
strs.remove(0);