我来自 .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似乎是多余和过度的。当然,堆栈跟踪会稍微干净一些(因为它的目标是上述方法,而不是HashMapJRE 实现中的内部检查)。但这必须抵消额外if语句的成本,此外,无论如何都不应该发生- 毕竟,传递null给上述方法不是预期的情况,这是一个相当愚蠢的错误。期待它是彻头彻尾的偏执 - 即使我不检查它也会失败并出现同样的异常。
[正如评论中指出的那样,HashMap.put实际上允许null键的值。所以在null这里检查不一定是多余的。]