Assert声明的好处是什么?我不知道为什么我需要使用它。我阅读了关于断言陈述的近100个问题/答案,但仍然不知道它有什么好处。我认为这个陈述有太多冲突。
例如,有些人说“从不在生产中使用它”,但有些人说“你可以在生产水平上使用它们”。 有些人说“始终处理生产中的断言错误”,但有些人说“永远不会在生产或开发层面处理断言错误”。
为什么这是错误的用法,例如https://stackoverflow.com/a/2758262/1379734
答案 0 :(得分:1)
为什么这被认为是错误的?
public int pop() {
// precondition
assert !isEmpty() : "Stack is empty";
return stack[--num];
}
assert
假设表示不变条件。如果pop()
是private
方法,那么您可以预期应仅由检查空堆栈的代码调用。由于此方法为public
,因此您无法控制在调用者中可以强制执行哪些假设。在这种情况下,堆栈下溢应该导致Exception
。
同样,assert
是必须为真的内容的声明,而不是可能为真的内容。 “May”条件应该通过其他运行时检查来强制执行,而不是在断言中声明。
是否在生产中启用断言取决于偏好。这样做的理由是断言永远不会失败,因此它们应该在生产中安全。反对这样做的论据是性能损失(计算某些assert
条件可能很昂贵),以及抛出Error
throwables的破坏性。
答案 1 :(得分:0)
你看起来很简单它总是一个好主意,或者它永远不是一个好主意。不是这种情况。它具有有意义的用例,在有限的情况下,你想要避免它们的性能,但这种情况非常罕见。
有些人不再了解断言,但很乐意发表意见。我建议你得出自己的结论,并在适合你的地方使用它。
关于错误和例外,我建议只处理这些
由于这个原因,我将Throwable捕获到我的线程的最高级别(就在它死之前)并确保它被正确记录。在所有其他情况下,我只捕获我可以做一些有用的例外。
答案 2 :(得分:0)
断言需要处理开销。从理论上讲,如果他们通过测试,就没有理由在生产中重新运行它们。您的测试可能是不完整的,并且断言可能会捕获测试期间未解决的意外情况,但希望日志可以让您找出出错的地方,而无需运行断言。