我正在编写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。但是,检测哪种情况是我的,这有点令人困惑。
是否有严格定义的方式,在哪里使用断言以及在何处使用运行时异常?
答案 0 :(得分:3)
断言通常是一种可以在生产中关闭的开发技术。在Java,Eiffel,C ++以及我所知道的使用它们的每种语言中都是如此。
我个人更喜欢运行时异常来强制执行合同。你无法关闭它们。
答案 1 :(得分:1)
不要使用断言来验证API的输入数据。如果您的API使用不当,只需抛出运行时异常,例如IllegalArgumentException
答案 2 :(得分:0)
断言仅用于测试。对于其他用法,您应该使用异常或结构(第二种解决方案是首选,因为它比捕获异常快得多)
答案 3 :(得分:-1)
不应使用断言或例外来实现业务逻辑。原因很简单:处理异常非常慢。想象一下,您的代码经常被调用,然后处理错误的输入,将花费太长时间。只接受一个契约:在调用之前检查变量并仅传递clean参数或在方法开头用if语句检查变量。
<强> UPD 强>:
应该使用断言来检查一些不应该发生的事情, 虽然应该使用例外来检查可能的内容 发生。
断言会抛出错误而不是异常,因为它们的错误 目的是让你的程序崩溃。
错误是Throwable的子类,表示严重问题 一个合理的应用程序不应该试图抓住。最多的 错误是异常情况。
AssertionError是Error
的子类