【问题标题】:In what cases would set.add() fail?在什么情况下 set.add() 会失败?
【发布时间】:2015-11-22 00:23:57
【问题描述】:

这是让我困惑的代码:

public class BoundedHashSet<T> {
    private final Set<T> set;
    private final Semaphore sem;
    public BoundedHashSet(int bound) {
        this.set = Collections.synchronizedSet(new HashSet<T>());
        sem = new Semaphore(bound);
    }
    public boolean add(T o) throws InterruptedException {
        sem.acquire();
        boolean wasAdded = false;
        try {
            wasAdded = set.add(o);    <-- line 1
            return wasAdded;
        }
        finally {
            if (!wasAdded)    <-- line 2
                sem.release();
        }
    }
    public boolean remove(Object o) {
        boolean wasRemoved = set.remove(o);
        if (wasRemoved)
            sem.release();
        return wasRemoved;
    }
}

我发现line 2 假设line 1 可能会失败,但我不知道在什么情况下会发生失败。

我查看了 Javadoc,以下是 set.add(o) 可能抛出的异常:

投掷:

UnsupportedOperationException - 如果此集合不支持添加操作

ClassCastException - 如果指定元素的类阻止它被添加到这个集合中

NullPointerException - 如果指定元素为 null 并且此集合不允许 null 元素

IllegalArgumentException - 如果指定元素的某些属性阻止它被添加到此集合中

我的问题是,在这个 sn-p 中,代码会抛出什么异常,导致 set.add(o 失败?

【问题讨论】:

  • 它会因您列出的所有原因而失败。此外,集合是对象的不同集合。如果您添加的对象已经存在,它将返回 false。
  • 既然你看起来很新:看看返回值的含义。例外是不同的东西,在这个 sn-p 中并不重要。

标签: java collections set


【解决方案1】:

这里没有“失败”

来自javadoc of Set#add(E)

返回: 如果此集合尚未包含指定元素,则为 true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多