在addAll()中异常后仍为空HashSet

时间:2014-12-05 16:57:03

标签: java null add hashset

    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

中的null元素

2 个答案:

答案 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;
}

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.addAll%28java.util.Collection%29