我有以下代码因IllegalArgumentException而失败
public EnumSet<test> getData(){ // Line 1
return EnumSet.copyOf(get(test))) // Line 2
}
private Collection<Test> get(Test[] test){ //Line 1
test= test==null ? new Test[0] : test; // line 2
return Array.asList(test) //Line 3
}
如果test为null,则 get 函数的第2行会创建Test的空数组
和EnumSet.copyOf(get(test)) throws IllegalArgumentException
我不明白为什么会抛出此异常?
答案 0 :(得分:3)
EnumSet
使用一些反射来标识其元素的类型。 (该集合使用enum
值中的"ordinal"来跟踪是否包含每个元素。)
使用EnumSet
创建copyOf(Collection)
时,它将检查集合是否为EnumSet
。如果是,则使用与源集相同的类型。否则,它将尝试在源集合中的第一个元素上调用getClass()
。如果集合为空,则没有第一个元素,也没有查询其类的东西。因此它在这种情况下会失败(“如果IllegalArgumentException
不是c
实例并且不包含任何元素,则会抛出EnumSet
”。
要创建一个空的EnumSet
,您需要自己确定该类,然后使用noneOf()
.
Collection<Test> tests = get(test);
return tests.isEmpty() ? EnumSet.noneOf(Test.class) : EnumSet.copyOf(tests);