【发布时间】:2012-02-05 22:22:36
【问题描述】:
我有一个方法,它被赋予了 Set 的对象。它委托给的方法要求Set 不包含任何空元素。我想check the precondition Set 在委托之前的方法中早期不包含空元素。这样做的明显代码是这样的:
public void scan(Set<PlugIn> plugIns) {
if (plugIns == null) {
throw new NullPointerException("plugIns");
} else if (plugIns.contains(null)) {
throw new NullPointerException("plugIns null element");
}
// Body
}
但这是不正确的,因为如果Set 实现本身 不允许空元素,Set.contains() 可能会抛出NullPointerException。在这种情况下捕获然后忽略NullPointerException 将起作用but would be inelegant。有没有一种简洁的方法来检查这个前提条件?
Set 接口是否存在设计缺陷?如果Set 实现可能永远不会包含空值,为什么不要求Set.contains(null) 始终返回false?或者有一个isNullElementPermitted() 谓词?
【问题讨论】:
-
如果您有这样的特定要求,请继承
Set并禁止nullputs。另外,我不会在这里使用else。 -
我同意这非常烦人。您允许使用通用
Set创建您的类,但要确保根据您的类合同它不包含nulls。然后,如果有人实际上传递了不允许nulls 的Set,那么您的安全contains检查会抛出 NPE,因为它在规范中。这是设计错误恕我直言,因为调用者对此无能为力(即,无法询问 Set 是否允许空值),更不用说在这种情况下抛出 NPE 而不是仅仅返回似乎很愚蠢false.
标签: java null set nullpointerexception