关于Collection下的removeAll方法抛出UnsupportedOperationException分析

起因

这周在开发的过程遇到了以下这个错误
在这里插入图片描述
之前一直规范运用Collection的接口,所以这个异常比较少见。所以我就纳闷了,做个一个实验。

package src;

import com.google.common.collect.Sets;
import lombok.Builder;
import lombok.Data;

import java.util.Arrays;
import java.util.Collection;


@Builder
@Data
public class Demo {

    private Integer number;
    private String name;

    public static void main(String[] args) {
        remove(Arrays.asList("1","3"));
    }


    public static void remove(Collection<String> id) {
        id.removeAll(Sets.newHashSet(Arrays.asList("1","2")));
    }


}

按道理程序没有进行错误显示,看似安然,实则隐藏大杀鸡。开始运行后。就会抛出UnsupportedOperationException异常。

分析

开始了源码分析
在这里插入图片描述
仔细看throws UnsupportedOperationException 异常这段话。
在这里插入图片描述
假如不是当前集合不支持这个方法的时候就会抛出该异常。
这时我们再看看原来的程序,Arrays.asList方法

  remove(Arrays.asList("1","3"));

在这里插入图片描述
再追踪一下
在这里插入图片描述
我们在ArrayList静态类下搜索removAll方法时,发现是不存在该方法的,所以不支持就会抛出UnsupportedOperationException

相似

那么在以后使用的使用这些工具类生成集合的时候还需要我们注意才行。比如该方法返回的list也不支持removeAll

Collections.singletonList("1")

解决方案

package src;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.Builder;
import lombok.Data;

import java.util.Arrays;
import java.util.Collection;


@Builder
@Data
public class Demo {

    private Integer number;
    private String name;

    public static void main(String[] args) {
        //remove(Arrays.asList("1","3"));
        remove(Lists.newArrayList("1","3"));
    }


    public static void remove(Collection<String> id) {
        id.removeAll(Sets.newHashSet(Arrays.asList("1","2")));
    }


}

总结

报错看问题还是先自己摸索一下,可以看看源码,源码的解释有时候比网上清楚,毕竟异常只有一个,抛出同一个异常所产生的条件却是有很多。所以还需要自己慢慢探究。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值