我从一个.净背景和现在涉足。

目前,我有个很大的问题设计一个API防御性对抗错误的输入。让我们说,我已经得到了下列代码(足够接近):

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

然而,这个代码可能会失败的原因有两个:

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

中。净的,我会扔一个 ArgumentNullException (而不是一个 NullReferenceException!) 或 ArgumentException 分别通过的名称侵犯的论点(node)作为一个 string 参数。

Java似乎没有等效的例外情况。我意识到我可以更具体而只是把任何外来最接近描述的情况,或甚至写我自己的异常类的具体情况。

这是最好的做法吗?或是有一般用途类别类似于 ArgumentException 中。净?

它甚至有意义的检查 null 在这种情况下?该守则将无论如何失败和异常的堆栈将包含上述方法的呼吁。检查针对 null 似乎是多余的和过度的。授予,堆叠的跟踪将是 稍稍 吸尘器(由于其目标是上述的方法,而不是内部检查 HashMap 执行java运行环境).但是,这必须抵销成本的额外 if 声明,其中,此外,应 从来没有 会发生无论如何–毕竟,传递 null 以上述方法不是预期的情况,这是一个相当愚蠢的错误。希望这是彻头彻尾的偏执–它将失败,同样的例外,即使我没有检查它。

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

有帮助吗?

解决方案

不同的群体有不同的标准。

首先,我假设你知道之间的差异 RuntimeExceptions(未检查)和正常 Exceptions(检查),如果不那么看 这个问题和答案.如果你写你自己的异常你可以迫使它被捕的,而这两个 NullPointerExceptionIllegalArgumentException 是RuntimeExceptions其是反对在某些圈子里。

第二,作为与你、组,我曾经使用但不要积极利用宣称,但是如果你的团队(或消费者的API)已经决定它将使用称,然后断言听起来像正是正确的机制。

如果我是你我会用 NullPointerException.为此原因,是先例。举一个例子API从太阳的,例如 java。工具.TreeSet.这种使用Npe正是出于这种情况,虽然它看起来像你的代码就使用空,这是完全适当的。

正如其他人所说的 IllegalArgumentException 是一种选择,但是我认为是异常的更多沟通。

如果这API的设计是用于由外部公司/团队我会坚持 NullPointerException, 但确定它宣布如果是的话,为什么不试.如果它是为内部使用,然后你可能会决定,添加自己的异常状视图是值得的,但我个人觉得Api加巨大的例外heirarchies,这只会 printStackTrace()d或记录的只是一个浪费的努力。

在一天结束时最主要的是,你代码连通清楚。一个地方异常状视图像是当地的行话-它增加了信息对于业内人士,但可以挡外来者。

关于检查对null我认为它不会有意义。首先,它允许添加一个什么消息是null(即节点或标记)的时候你建造的例外,将会有所帮助。其次,在未来你可能会使用 Map 执行情况允许 null, 然后你就失去了错误的检查。成本几乎是一无所有,因此,除非一个profiler说这是一种内在的循环问题我不会担心它。

其他提示

标准Java exception IllegalArgumentException.一些会扔 NullPointerException 如果参数是空的,但对我来说,展会上说:"有人搞砸了"内涵,并且你不想要的客户你的API认为你不知道你在做什么。

对于公共Api,检查参数,并尽早失败和干净。时间/成本几乎没有事项。

在Java你通常会引发IllegalArgumentException

如果你想要一个指导有关如何编写良好的代码,我强烈推荐这本书 有效的Java 约书亚布洛克.

这听起来像这可能是一个适当的使用 assert:

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

你的方法,完全取决于什么是合同您的功能提供来电-是的先决条件,节点不是空?

如果是,那么你应该把一个异常点是空的,因为它是一种合同的违反。如果它不是那么你的功能应该静静地处理空节点,并作出适当的反应。

我认为,这在很大程度上取决于合同的方法和如何以及主叫方所知。

在某些点上的进程的呼叫者可以采取行动来验证的节点之前呼唤你的方法。如果你知道你的呼叫者以及知道,这些节点始终验证,然后我觉得它是好假设您会获得良好的数据。基本责任是在呼叫者。

但是如果你是,例如,提供第三方的图书馆分布然后你需要验证的节点null,etc...

一个illegalArugementException是java的标准,但也是一个异常.所以如果你想要力的呼叫者来处理异常然后你需要设置一个检查异常,可能是一个自定义的创建。

我个人想NullPointerExceptions只是偶然发生的,所以别的东西必须用来指明一个非法的论点值得通过。IllegalArgumentException是现这一点。

if (arg1 == null) {
 throw new IllegalArgumentException("arg1 == null");
}

这应该足够这些阅读的编码,但也可怜的灵魂得到支持呼吁在凌晨3.

(而且,总是提供一个解释性的文本对于你的情况外,你们将欣赏他们的一些悲伤的一天)

像其他:java。郎。IllegalArgumentException.关于检查空节点,怎么样检查坏输入的节点的创造?

我不需要请人,所以我做什么现在作为规范的代码是

void method(String s) 

if((s != null) && (s instanceof String) && (s.length() > 0x0000))
{

这让我很多的睡眠。

其他人会持不同意见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top