Java &引用;断言;在爪哇
可能重复:Java &引用;断言;在爪哇,java,assert,Java,Assert,可能重复: 什么是“断言”?“断言”关键字的用途是什么?何时何地有用 这是红黑树实现的方法示例: public Node<K,V> grandparent() { assert parent != null; // Not the root node assert parent.parent != null; // Not child of root return parent.parent; } 公共节点祖父母(){ 断言父节点!=null;//不是根节
什么是“断言”?“断言”关键字的用途是什么?何时何地有用 这是红黑树实现的方法示例:
public Node<K,V> grandparent() {
assert parent != null; // Not the root node
assert parent.parent != null; // Not child of root
return parent.parent;
}
公共节点祖父母(){
断言父节点!=null;//不是根节点
assert parent.parent!=null;//不是根的子级
返回parent.parent;
}
我不知道这段代码中“assert”是什么意思。我们不能用其他方式键入此代码,例如用“if's”代替吗 Assert是一个调试工具:它测试一个条件,如果条件不成立,则抛出一个
AssertionError
。您可以使用它来检查算法的前置条件、不变量和后置条件是否成立。不要将其用于输入验证;它旨在捕获程序员错误。断言父级!=如果条件(parent!=null
)为false,null将抛出一个AssertionError
。这可用于检测应用程序中的错误
您可以对if
执行相同的操作,但是可以在运行时使用-ea
JVM参数启用或禁用断言。当禁用它们时,它们对性能没有影响,而总是执行if
s
当然,这意味着你不应该将它们用于关键检查,比如那些检查异常用户输入或IO错误的检查。大多数情况下,您都希望使用if
,除非它们对性能有显著影响。来自:
断言是包含布尔表达式的语句。断言被启用或禁用。如果启用了断言,则断言的计算将导致布尔表达式的计算,如果表达式的计算结果为false,则会报告错误。如果断言被禁用,那么断言的评估将没有任何效果
请按照链接了解更多详细信息
就我个人而言,我通常更喜欢总是启用的检查——我不喜欢生产中的代码更改行为(以一种危险的方式,即允许在异常情况下继续执行)。这有点像在缓慢行驶时决定系安全带,但在比赛中却要系安全带……在这种情况下,断言用于确保先决条件是真实的。有关详细信息,请参见断言用于测试有关运行代码的假设。如果检查有以下几种方式,则它们与
不同:
- 默认情况下,在运行时禁用断言
- 断言不应用于参数检查或程序正常运行所需的任何其他操作
- 断言通常测试关于您以前在注释中可能看到的状态的假设。例如,您可以使用断言来验证您没有违反循环不变量,或者方法的前提条件已经满足
if
语句用于控制流、参数检查等。断言用于在开发和调试期间对内部方法等的正确性进行推理
实际上,这两条线:
assert parent != null; // Not the root node
assert parent.parent != null;
…强制执行调用此方法时,parent
或parent.parent
都不是null
。如果其中任何一个断言失败,程序将抛出一个AssertionError
,还请注意,该代码段的作者很可能误用了assert
。正如您所说,断言不是用于参数检查的。因此,上面的方法是错误的断言应用程序的示例。事实上,assert
的这种使用并不是“错误的”,但它可能并没有那么有用。如果父级parent
为null
,它将在取消引用时在return语句中抛出NullPointerException。因此,第一个断言更像是文档,而不是在开发和测试期间检测null
值的实用方法。第二个assert
语句将“failearly”,这可能很有用,而不是等待以后的失败,后者可能需要更多的工作才能追溯。然而,assert
语句只是生产代码的文档。关于最后一段:虽然我同意你可以在那里找到一些很难找到的bug(经典的assert mutatingFunction()
),但我喜欢能够在断言中进行一些非常昂贵的测试(即,一个检查大型数据结构完整性的函数)这是我在生产代码中确实做不到的。另一方面,我看到断言的另一个问题是,它们导致程序员在显然应该进行错误处理的情况下不必担心错误处理。