Java异常 java.lang.UnsupportedOperationException

Java异常 java.lang.UnsupportedOperationException

java.lang.UnsupportedOperationException
	at java.util.AbstractList.remove(AbstractList.java:161)
	at java.util.AbstractList$Itr.remove(AbstractList.java:374)
	at java.util.AbstractCollection.remove(AbstractCollection.java:293)

产生异常的代码块:

List selectUserIdList = Arrays.asList(userIds);
        // 获取该角色下的用户集合
        List roleUserList = userRoleMapper.getUsersByRoleId(null, roleId, null);
        // 移除掉userIds中已经存在该角色下用户id
        if(! roleUserList.isEmpty()) {
            for (SysUserRoleEntity item : roleUserList) {
                selectUserIdList.remove(item.getUserId());
            }
        }

这里主要涉及到 java.util.Arrays 类中的内部类 ArrayList 类和 java.util.ArrayList 类的区别。

1、首先看一下 Arrays 类

Arrays 类结构如下:
Java异常 java.lang.UnsupportedOperationException_第1张图片
Arrays.asList() 方法返回的是内部类 ArrayList ,asList() 方法如图:
Java异常 java.lang.UnsupportedOperationException_第2张图片
可以看到,Arrays 类中的内部类其实也是继承了抽象类 AbstractList 类,但是并没有重写 AbstractList 中的 remove() 方法,而 AbstractList 类中的 remove() 方法默认抛出异常 UnsupportedOperationException,不做任何操作,如图:
Java异常 java.lang.UnsupportedOperationException_第3张图片

2、再看一下 ArrayList 类

ArrayList 类结构如下图:
Java异常 java.lang.UnsupportedOperationException_第4张图片
点到 remove() 方法可以看到,ArrayList 类是重写了父类AbstractList 类中的 remove() 方法的。如图:
Java异常 java.lang.UnsupportedOperationException_第5张图片

3、解决异常方法:

  1. 将 asList() 结果再次 new ArrayList(),转成 java.util.ArrayList 类对象;
    List selectUserIdList = Arrays.asList(userIds);
    List arrayList = new ArrayList(selectUserIdList);

你可能感兴趣的:(Java异常)