首页 > 解决方案 > 我应该为无效输入抛出已检查或未检查的异常吗?

问题描述

我正在编写一个期望一些输入的方法。现在,我认为以防御方式编写它是一个好习惯(即检查输入是否正确)。

基本上,输入应该没问题,因为只有一个地方(可靠)使用这种方法。

所以我的问题是,

  1. 防御性编程在这里合理吗?
  2. 如果是这样,它应该抛出一个已检查或未检查的异常吗?

标签: javadefensive-programming

解决方案


想想如果您没有进行该检查并且输入了一些无效输入,系统或应用程序的其余部分会发生什么。

你有一个安全的默认值来回退和使用吗?它是否适用于所有情况?您的代码/API 的调用者/客户端是否需要得到通知?因此,基于此,您甚至可以只记录警告并继续使用默认值。但在大多数情况下,情况并非如此。

[..] 只有一个地方(可靠)使用这种方法。

到今天为止。将来,它可能会改变。因此,IMO,您可以检查输入是否有效。

它应该抛出一个已检查或未检查的异常吗?

这再次将我们带回到您的代码/API 的调用者或客户端。你想让他们期待它发生并处理它吗?如果他们可以处理异常并恢复,那么这是有道理的(注意:这意味着所有调用者try..catch在调用您的 API/代码时都需要有一个块)。否则,如果他们应该传递一个有效的值,如果他们不传递,一个未经检查的异常会做(在合同/Javadoc中明确说明)

让我们看一个 Java 库本身的例子。

类中的许多方法File都会引发检查异常。

Integer.valueOfNumberFormatException如果输入无效,则抛出一个(这是一个未经检查的异常)。


一个好的做法是,任何公共 API 都必须验证其输入。

另外,在决定之前看看Java:checked vs unchecked 异常解释


推荐阅读