gpt4 book ai didi

java - 防御性编程 : Guidelines in Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:08 25 4
gpt4 key购买 nike

我有 .NET 背景,现在正在涉足 Java。

目前,我在设计一个针对错误输入的防御性 API 时遇到了很大的问题。假设我有以下代码(足够接近):

public void setTokens(Node node, int newTokens) {
tokens.put(node, newTokens);
}

但是,此代码可能因以下两个原因而失败:

  1. 用户传递了一个null节点。
  2. 用户传递了一个无效节点,即图中未包含的节点。

在 .NET 中,我会抛出一个 ArgumentNullException (而不是 NullReferenceException!)或 ArgumentException分别将有问题的参数 (node) 的名称作为 string 参数传递。

Java 似乎没有等效的异常。我意识到我可以更具体,只抛出最接近描述情况的任何异常,或者甚至为特定情况编写我自己的异常类。

这是最佳做法吗?或者.NET 中有类似ArgumentException 的通用类吗?

在这种情况下检查 null 是否有意义?代码无论如何都会失败,异常的堆栈跟踪将包含上述方法调用。检查 null 似乎是多余和过度的。当然,堆栈跟踪将稍微更清晰(因为它的目标是上述方法,而不是 JRE 的 HashMap 实现中的内部检查)。但这必须抵消额外的 if 语句的成本,此外,永远不会无论如何都不应该发生 - 毕竟,将 null 传递给上述方法不是预期的情况,这是一个相当愚蠢的错误。期待它是彻头彻尾的偏执狂——即使我不检查它,它也会失败并出现同样的异常。

[正如评论中指出的那样,HashMap.put 实际上允许键的 null 值。因此,对 null 的检查在这里不一定是多余的。]

最佳答案

标准的 Java 异常是 IllegalArgumentException。如果参数为 null,有些会抛出 NullPointerException,但对我来说,NPE 具有“有人搞砸了”的含义,并且您不希望 API 的客户认为您不知道自己在做什么正在做。

对于公共(public) API,检查参数并尽早干净地失败。时间/成本几乎不重要。

关于java - 防御性编程 : Guidelines in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com