起因
这周在开发的过程遇到了以下这个错误
之前一直规范运用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")));
}
}
总结
报错看问题还是先自己摸索一下,可以看看源码,源码的解释有时候比网上清楚,毕竟异常只有一个,抛出同一个异常所产生的条件却是有很多。所以还需要自己慢慢探究。