项目运行过程中,发现异常抛出 java.lang.UnsupportedOperationException。追踪源头之后发现是使用了集合类中 Collections.unmodifiableList 方法导致,下面就此问题对度娘发起了询问~
异常原因
1. 此集合方法返回的是一个只读集合,如果对此集合做其他操作就会抛出异常,查看源码后得知,此方法只实现了get方法,其他方法一律抛出异常,源码如下:
2. 可以看到,除了get方法,set、add、remove方法在调用时全部抛出UnsupportedOperationException异常。因为是大佬写的代码,咨询大佬后得知,如此设计是因为项目会生成一个报告,而这个报告中数据在产生后不可被修改的,所以使用了集合中的这个方法,来确保数据不会被修改。
如果想要再次对这个集合进行修改操作,可以在外部在包一层集合例 :Lists.newArrayList(Collections.unmodifiableList())
3. 同样的 Collections 集合类中的 unmodifiableMap()、unmodifiableSet()方法也是只读。
扩展部分:
在Arrays.asList() 及 Lists.asList() 中也是对返回的集合不可修改,而两者又有一些不同。
Arrays是数组工具类,asList()方法可以将数组转为List集合。其继承父类为AbstractList,其内部实现了 get()、set()方法,其余继承父类中的方法,Arrays源码为:
父类 AbstractList 源码为:
可以看到除了重新实现的,其他返回抛出异常。而 Lists.asList() 中的实现类同样继承AbstractList,但它只实现了get()方法,其余方法使用父类中方法,感兴趣的可以看看源码~