我来自 .NET 背景,现在涉足 Java。
目前,我在设计一个针对错误输入的防御性 API 时遇到了很大的问题。假设我有以下代码(足够接近):
public void setTokens(Node node, int newTokens) {
tokens.put(node, newTokens);
}
但是,此代码可能会因两个原因而失败:
- 用户传递一个
null
节点。 - 用户传递了一个无效节点,即图中未包含的节点。
在 .NET 中,我会分别抛出一个ArgumentNullException
(而不是一个NullReferenceException
!)或一个ArgumentException
,将有问题的参数 ( node
) 的名称作为参数传递string
。
Java 似乎没有等效的异常。我意识到我可以更具体,只抛出最接近描述情况的任何异常,甚至为特定情况编写我自己的异常类。
这是最佳做法吗?ArgumentException
或者是否有类似于.NET 中的通用类?
在这种情况下进行检查是否有意义null
?无论如何,代码都会失败,异常的堆栈跟踪将包含上述方法调用。检查null
似乎是多余和过度的。当然,堆栈跟踪会稍微干净一些(因为它的目标是上述方法,而不是HashMap
JRE 实现中的内部检查)。但这必须抵消额外if
语句的成本,此外,无论如何都不应该发生- 毕竟,传递null
给上述方法不是预期的情况,这是一个相当愚蠢的错误。期待它是彻头彻尾的偏执 - 即使我不检查它也会失败并出现同样的异常。
[正如评论中指出的那样,HashMap.put
实际上允许null
键的值。所以在null
这里检查不一定是多余的。]