可能重复:
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”而不是?
答案 0 :(得分:5)
断言用于测试有关运行代码的假设。它们与if
检查有许多不同之处:
if
语句用于控制流,参数检查等。断言用于在开发和调试期间推断内部方法等的正确性。
在实践中,这两行:
assert parent != null; // Not the root node
assert parent.parent != null;
...强制调用此方法时,parent
或parent.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