断言VS运行时异常

时间:2013-03-09 15:13:57

标签: java runtime-error

我正在编写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。

还尝试阅读类似的帖子When to use an assertion and when to use an exception。但是,检测哪种情况是我的,这有点令人困惑。

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

4 个答案:

答案 0 :(得分:3)

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

我个人更喜欢运行时异常来强制执行合同。你无法关闭它们。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

不应使用断言或例外来实现业务逻辑。原因很简单:处理异常非常慢。想象一下,您的代码经常被调用,然后处理错误的输入,将花费太长时间。只接受一个契约:在调用之前检查变量并仅传递clean参数或在方法开头用if语句检查变量。

<强> UPD

  

应该使用断言来检查一些不应该发生的事情,   虽然应该使用例外来检查可能的内容   发生。

Using Assertions in Java

  

断言会抛出错误而不是异常,因为它们的错误   目的是让你的程序崩溃。

Class Error

  

错误是Throwable的子类,表示严重问题   一个合理的应用程序不应该试图抓住。最多的   错误是异常情况。

AssertionError是Error

的子类