4

我正在编写 API,所以我的 API 将被外部模块使用。这是一种我无法弄清楚使用什么断言或java.lang.IllegalArgumentException

/**
 * Adds translation of information to underlying store for particular language
 * @param languageId The identifier of the language 
 * @param translation The translation provided for the specific language
 * @throws AssertionError if the provided language id is {@code null} or empty
 *         or provided translation is {@code null} or empty
 */
public final void addTranslation(String languageId, String translation){
    assert !(Strings.isNullOrEmpty(languageId));
    assert !(Strings.isNullOrEmpty(translation));

    translations.put(languageId, translation);
}

如果我使用运行时异常,我认为它可能会损害使用此 API 的应用程序的执行。如果我使用断言,那么如果断言标志被禁用,它将损害我的 API。

还尝试阅读类似的帖子何时使用断言以及何时使用异常。但是检测哪种情况是我的有点令人困惑。

是否有严格定义的方式,在哪里使用断言以及在哪里使用运行时异常?

4

4 回答 4

4

断言通常是一种可以在生产中关闭的开发技术。在 Java、Eiffel、C++ 以及我所知道的所有使用它们的语言中都是如此。

就个人而言,我更喜欢运行时异常来执行合同。你不能把它们关掉。

于 2013-03-09T15:15:45.583 回答
2

不要使用断言来验证 API 的输入数据。例如,如果您的 API 使用不正确,只需抛出运行时异常IllegalArgumentException

于 2013-03-09T15:17:22.373 回答
0

断言仅用于测试。对于其他用途,您应该使用异常或 if structores(首选第二种解决方案,因为它比捕获异常快得多)

于 2013-03-09T15:18:05.500 回答
-2

断言和异常都不应该用于实现业务逻辑。原因很简单:处理异常非常慢。想象一下,您的代码被非常频繁地调用,然后处理错误的输入,将花费太长时间。只接受一份合约:在调用前检查变量,只传递干净的参数或在方法开始时使用 if 语句检查变量。

更新

断言应该用于检查不应该发生的事情,而异常应该用于检查可能发生的事情。

在 Java 中使用断言

断言会引发错误而不是异常,因为它们的目的是使您的程序崩溃。

类错误

Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。

AssertionError 是 Error 的子类

于 2013-03-09T15:48:24.097 回答