Set<String> set = new HashSet<String>() {
public boolean add(String arg0) {
if (arg0 == null) {
throw new IllegalArgumentException("Cannot add null to Set");
}
return super.add(arg0);
}
};
set.add("s0");
Set<String> toAdd = new HashSet<String>();
toAdd.add("s1");
toAdd.add("s2");
toAdd.add(null);
toAdd.add("s4");
toAdd.add("s5");
try {
set.addAll(toAdd);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
System.out.println(set.toString());
这是我的代码。我创建了一个HashSet
,您无法添加null,否则您将获得IllegalArgumentException
。然后我将String
"s0"
添加到HashSet
,然后再创建HashSet
以使用addAll()
测试我的代码,因为addAll()
使用{ {1}}方法。
代码输出:
add()
正如您所看到的那样,java.lang.IllegalArgumentException: Cannot add null to Set
at testprogramm.TestProgramm$1.add(TestProgramm.java:17)
at testprogramm.TestProgramm$1.add(TestProgramm.java:1)
at java.util.AbstractCollection.addAll(Unknown Source)
at testprogramm.TestProgramm.main(TestProgramm.java:39)
[s0]
按计划进行,但为什么IllegalArgumentException
{{String
toAdd
中只有HashSet
set
HashSet
1}?不应该set
HashSet
中的所有字符串都使用较低的&#34;索引&#34; toAdd
HashSet
?
答案 0 :(得分:3)
如果向HashSet添加空值,迭代器将返回null值作为第一个元素。这就是为什么你只能看到第一个元素[s0]。你可以打印添加并测试它(System.out.println(toAdd.toString()))
答案 1 :(得分:1)
addAll(Collection)是java.util.AbstractCollection的方法,它不捕获任何异常。 当HashSet与第一个元素一起传递为null时。对第一个null元素进行迭代,作为执行
throws IllegalArgumentException("Cannot add null to Set")
所以不再发生迭代了。没有添加任何元素。
addAll方法详情:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next()))
modified = true;
}
return modified;
}