在java中“断言”

时间:2011-12-10 22:29:19

标签: java assert

  

可能重复:
  What does assert do?

什么是“断言”?什么是“断言”关键词用于?何时何地有用?

这是红黑树实现的方法示例:

public Node<K,V> grandparent() {
    assert parent != null; // Not the root node
    assert parent.parent != null; // Not child of root
    return parent.parent;
}

我不知道在这段代码中使用了什么“assert”。我们不能以其他方式键入此代码,例如 - “if's”而不是?

5 个答案:

答案 0 :(得分:5)

断言用于测试有关运行代码的假设。它们与if检查有许多不同之处:

  • 默认情况下,在运行时禁用断言
  • 断言不应用于参数检查,也不应用于程序正常运行所需的任何其他内容。
  • 断言通常会测试您之前在评论中看到过的状态的假设。例如,您可以使用断言来验证您是否违反了循环不变量或者方法的前提条件是否已满足。

if语句用于控制流,参数检查等。断言用于在开发和调试期间推断内部方法等的正确性。

在实践中,这两行:

assert parent != null; // Not the root node
assert parent.parent != null;

...强制调用此方法时,parentparent.parent都不是null。如果其中任何一个断言失败,程序将抛出AssertionError

答案 1 :(得分:3)

如果条件(assert parent != null)为false,

AssertionError将抛出parent != null。这可用于检测应用程序中的错误。

您可以对if执行相同操作,但可以在运行时使用-ea JVM参数启用或禁用断言。当他们被禁用时,他们对性能有0影响,而if总是被执行。

当然,这确实意味着您不应该将它们用于关键检查,例如检查特殊用户输入或IO错误的检查。大多数情况下,您仍然希望使用if,除非它们对性能产生重大影响。

答案 2 :(得分:2)

来自Java Language Specification, section 14.10

  

断言是包含布尔表达式的语句。断言被启用或禁用。如果断言已启用,则断言的评估将导致对布尔表达式的求值,如果表达式求值为false,则报告错误。如果断言被禁用,则对断言的评估不会产生任何影响。

点击链接了解更多详情。

就我个人而言,我通常更喜欢始终启用的检查 - 我不喜欢生产中代码更改的行为(以危险的方式,即允许在奇怪的情况下继续执行)。这有点像在慢慢开车时决定系上安全带,但是为了比赛而把它拿下来......

答案 3 :(得分:1)

Assert是一个调试工具:它测试条件并在条件不成立时抛出AssertionError。您可以使用它来检查算法的前置条件,不变量和后置条件是否成立。不要将它用于输入验证;这意味着要抓住程序员的错误。

答案 4 :(得分:0)

此情况下的断言用于确保前置条件为真。有关详细信息,请参阅design by contract