使用ArrayList实例add()方法报错unsupportedOperationException
首先介绍下报错背景,在我实际开发中,使用add()方法添加元素时报这个错,我百思不得其解,这不就是正常的集合操作方法么?哪里出了问题呢?
我首先想到的是查看ArrayList源码,如下
带着疑问,我继续检查以前写的代码,代码中我使用protobuffer作数据入库的序列化和反序列化格式,而当反序列化时
byte[] taskListBytes = playerDb.getTaskList();
if (taskListBytes != null) {
this.alltaskMap.byteRead(DbTaskMapInfo.parseFrom(taskListBytes));
}`
taskListBytes为查库返回的字节数组,再转成pb对象。
List<Integer> hadDailyRewardList = new ArrayList<>();
hadDailyRewardList = t.getHadDailyScoreRewardListList();
t–为Pb对象,接下来当我操作hadDailyRewardList使用add()方法时,就出现了这个错误。
看到这里我开始想,是不是pb反序列化时对原来存入的集合格式进行了更改,于是我就继续看生成的pb文件的代码
private java.util.List<java.lang.Integer> hadDailyScoreRewardList_ = java.util.Collections.emptyList();;
emptyList的类型是来自于下面的代码
private static class EmptyList<E>
extends AbstractList<E>
可见它继承了AbstractList,我查看EmptyList中的代码,发现并没有重写add()方法,所以我看一下AbstractList中的add方法,如下::::
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
现在我算是明白了,就是AbstractList不支持这个add方法,只要是继承了AbstractList又没有重写的子类都会发生这种情况。
解决方法
我直接new了个ArrayList,把从pb对象中get的emptyList塞进去,问题解决。
hadDailyRewardList = new ArrayList<>(t.getHadDailyScoreRewardListList());
总结
当遇到问题的时候还是要尽量根据报错信息去看源码,少些百度,多些思考。这虽然是一个很简单的问题,但却也困扰了我一会,以后会继续记录工作学习中遇到的问题,希望大家多多支持,更期待大家的建议和指正,相信能间接影响更多的人。
Sharing is the best learning。