【发布时间】:2013-12-23 08:34:23
【问题描述】:
考虑一个哈希表,如果 get 和 put 操作的 key 为 null,它将引发 NullPointerException (NPE)。这让我想象异常应该是对称的,即 NPE 对于所有涉及空节点输入参数的哈希表操作应该是一致的。
我的理解正确吗?
如果是,那么考虑一个示例类 Graph 的情况,它在下面使用了一个 HashMap。它旨在为空输入抛出 NPE。无需了解其内部结构,它有两个功能:
graph.addNode (node); // throws NPE if node is null.
graph.getEdges (node); // Should empty collections be returned
// or NPE for null node ?
根据Effective Java,我们应该更喜欢返回空集合而不是null。现在,如果节点参数为空并且我们想要获取它的边,map.get(null node) 将返回一个空集合。是否仍然首选返回 NPE 以保持对称性?
【问题讨论】:
-
如果 node 不期望为 null 则抛出 NPE,因为对于这些您不期望的情况会出现异常。否则返回一个空集合。我同意@duncan 的观点,即他是基于观点的,因为这里有不止一种方法可以使用
-
NPE 可能更一致,但空集合可能更易于使用...
-
这对我来说是一个非常有效的问题。
-
@JBNizet 经过进一步思考并看到您的出色回答,我撤回了我的投票。我想这里的答案很明确。