java.lang.UnsupportedOperationException异常处理

java.lang.UnsupportedOperationException异常处理


欢迎移步博主小站:白亮吖雅黑丫の小站

初次碰见此类异常,深感大坑!写下此篇blog记录

报错源代码如下:

//memberIdList的定义  
//yjyProTopic.getMembersId()是中间带','的字符串
List<String> memberIdList = Arrays.asList(yjyProTopic.getMembersId().split(","));

//抛出异常代码  注:添加的元素类型为String
memberIdList.add(yjyProTopic.getCtoId());

看到这时发现很懵逼,为什么一个List类型的对象在调用add方法时报java.lang.UnsupportedOperationException异常呢?为此我百思不得其解


  • 进入Arrays源码

    ①定位到asList方法

    /**
         * Returns a fixed-size list backed by the specified array.  (Changes to
         * the returned list "write through" to the array.)  This method acts
         * as bridge between array-based and collection-based APIs, in
         * combination with {@link Collection#toArray}.  The returned list is
         * serializable and implements {@link RandomAccess}.
         *
         * <p>This method also provides a convenient way to create a fixed-size
         * list initialized to contain several elements:
         * <pre>
         *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
         * </pre>
         *
         * @param <T> the class of the objects in the array
         * @param a the array by which the list will be backed
         * @return a list view of the specified array
         */
        @SafeVarargs
        @SuppressWarnings("varargs")
        public static <T> List<T> asList(T... a) {
            return new ArrayList<>(a);
        }
    

    ②发现asList内部是new了一个ArrayList对象,正当我以为它就是普普通通的ArrayList类时,Arrays源码中的下一行代码引起了我的注意

    private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable{
        //...省略
    }
    

    ③这里证明,此处new的ArraysList对象其实是Arrays的一个内部类的实例化对象(而不是java.util.ArraysList类的实例化对象),于是开始查看内部类ArraysList对象代码并比较区别

    因为篇幅原因,此处省略各个类的代码展示,有兴趣的朋友自行查看

    ④比较完两个类的源代码我发现,虽然都是继承AbstractList<E>这个抽象类,但是在java.util.ArraysList类中重写了抽象类中的add、addAll、remove、removeAll等方法,但是在Arrays中的内部类ArrayList则没有重写这些方法,于是出现在使用这些未重写的方法时系统抛出java.lang.UnsupportedOperationException异常

    ⑤解决办法:

    ​ 在Arrays.asList后如需使用add、remove等此类方法,采用重新实例化一个java.util.ArrayList类对象

    //改写后的代码
    List<String> memberIdList = new ArrayList<>(Arrays.asList(yjyProTopic.getMembersId().split(",")));
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值