Assert声明有什么好处?

时间:2013-10-31 16:18:54

标签: java assert

Assert声明的好处是什么?我不知道为什么我需要使用它。我阅读了关于断言陈述的近100个问题/答案,但仍然不知道它有什么好处。我认为这个陈述有太多冲突。

例如,有些人说“从不在生产中使用它”,但有些人说“你可以在生产水平上使用它们”。 有些人说“始终处理生产中的断言错误”,但有些人说“永远不会在生产或开发层面处理断言错误”。

为什么这是错误的用法,例如https://stackoverflow.com/a/2758262/1379734

3 个答案:

答案 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)

断言需要处理开销。从理论上讲,如果他们通过测试,就没有理由在生产中重新运行它们。您的测试可能是不完整的,并且断言可能会捕获测试期间未解决的意外情况,但希望日志可以让您找出出错的地方,而无需运行断言。