【发布时间】: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