目前,我在设计API时遇到了防御性地处理错误输入的大问题。假设我有以下代码(足够接近):
public void setTokens(Node node, int newTokens) {
tokens.put(node, newTokens);
}
然而,此代码可能因以下两个原因而失败:
- 用户传递了一个
null
节点。 - 用户传递了一个无效节点,即不包含在图中的节点。
在 .NET 中,我会分别抛出一个 ArgumentNullException
(而不是 NullReferenceException
!)或一个 ArgumentException
,并将有问题的参数名称 (node
) 作为 string
参数传递。
Java 似乎没有等效的异常。我意识到我可以更具体地抛出最接近描述情况的任何异常,甚至为特定情况编写自己的异常类。
这是最佳实践吗?还是有类似于 .NET 中的 ArgumentException
的通用类?
[正如评论中指出的那样,HashMap.put实际上允许键的null值。因此,在这里检查null并不一定是多余的。]
Hashtable
或者ConcurrentHashMap
,那么调用setTokens(null, 0)
只会抛出一个NullPointerException
,因为它们不允许使用null
作为键。另一方面,HashMap
可以使用null
作为键。 - pjp