在Java中使用assert是一种好习惯吗?

我知道关键字assert存在于java中。 但是我不记得看到使用它的代码。 可能我正在使用exception和登录我可以使用它的地方。 在java中使用assert关键字是一个好习惯吗?

编辑 :我知道断言一般是一个好习惯。 我的问题是,更准确一点,如果在java中断言的BKM使用assert关键字而不是使用exception,日志记录和其他技术。

断言未使用的主要原因是默认情况下未启用断言。 因此,如果您的条件非常重要,需要断言,则不能依赖启用断言来完成工作。

正如其他答案已正确声明的那样,它们是专为开发时测试和调试而设计的,因为如果在生产中禁用断言,它们就不会花费任何成本。 我认为最好在测试框架中创建显式测试(例如边缘条件的unit testing),而不是依赖于在测试时启用断言的人。

但是,我看到使用断言的一个很好的例子是检查私有方法参数。 由于您控制对这些方法的访问,因此您可以检查您自己的类是否正确使用该方法,而您的公共方法使用更可靠的参数检查技术(注释,if语句,第三方库等)。 这样,即使断言被禁用,您的方法也应该受到保护,但是查看源代码的开发人员可以查看您的方法的前提条件,并在处理该类时为其他安全网打开断言。

当我用C ++编写时,我使用的断言比使用Java时更多。 我没有那么多使用它们,因为我不再需要它们了。 我试图用断言捕获的许多C ++错误在Java中不再是问题。

话虽如此,断言是非常有价值的,但很多人不会使用它们,部分原因是因为他们不了解它们。 我听说有人抱怨他们抛出错误而不是exception。 我也听过这个问题:你为什么不使用exception处理案例而不是使用断言?

我对两者的回复是一样的。 断言不应该捕获您希望在工作应用程序中看到的情况。 断言的目的是捕获错误。 你应该只使用它们,“处理”它们的唯一方法是返回并修复代码。 这就是为什么他们不抛出exception – 你不希望它们成为你的一般exception处理的一部分。

至于打开它们,我的IDE设置为默认打开它们。 所以,对于我的内部测试,我总是知道他们正在进行。

这是一个断言是唯一使用的例子:我在一个大型Swing项目中工作,原始编码器不知道UI只能从事件线程更新,这导致了各种各样的错误。 所以我在许多地方放置了这个断言,事情表现得很有趣:断言EventQueue.isDispatchThread(); 如果这个断言被触发,我们就是从错误的线程运行,开发人员需要得到通知,以便他们可以将代码移动到正确的线程。 在工作应用程序中处理这个问题没办法。

是的,这很奇怪。 该function受到高度要求,但在引入该语言之后,几乎没有人使用它。

我有时使用assert作为评论工具。 代替

 // now it should be empty 

我可以写

 assert size == 0; 

但我并没有真正打开assert ,所以断言从未经过测试。

人们可能更喜欢从外部测试代码,并且他们不觉得需要在代码流中植入许多断言。

是的,断言你的假设是一种很好的做法。 阅读合同设计 。 assert可用于在集成和测试阶段validation前置条件,不变量和后置条件。 这有助于在开发和测试阶段捕获错误。 您可以安全地将其关闭以避免出现性能问题。

断言通常用于检查内部方法逻辑的正确性或在给定的类中强制执行合同。 但是使用例外来使合同明确。

这些天断言的用处不多。 它在开发期间的性能关键应用程序中非常有用,可以清除所有错误,然后通过交换机简单地禁用断言。

在运行时禁用断言是主要的好处,因为在禁用时,它们基本上消耗掉零资源。

例如,一种更“现代”的方法是使用Google Guava和Preconditions 。 这是一种库类型断言机制,您可以在必须满足条件时使用它,并且您不想在Java开关中摸索。

在我的algortihms讲座中,我的讲师始终保持断言的有用性。 它们主要用于测试和调试目的,这就是为什么你会看到使用它的代码。 但是,是的,他们非常推荐。 如果你担心表现,他们可以被禁用。 通常我使用System.out.println或断点来测试,但断言也是一种方式。 这就是我的意思:

 For example, to prove that sort+reverse is equivalent to sort in reverse order: Method 1: sort(int[] arr, int len) // pre: len is the length of the array arr // post: arr is sorted in ascending order Method 2: reverse(int[] arr) // post: the order of elements in arr is // reversed (eg [9 5 10] -> [10 5 9]) Assertion 1: the length of arr is len sort(arr,len); Assertion 2: arr is sorted in ascending order reverse(arr); Assertion 3: the order of arr is reversed 

嗯,这实际上取决于你如何看待它,但是,建议。

例如,如果您编写一个计算粒子速度的方法,您可能会断言计算出的速度小于光速。

在我的java应用程序中使用断言时,我非常高兴,sqlite-jdbc为一个案例返回了一些智能断言。

因此,如果您打开断言,它们可能会出现在某些第三方库中。

这对短期条件有利。 但是,使用取决于您的编码实践。 因为,有时使用“断言”然后使用强硬的方法可以更好地应用逻辑!

是。 这是一种validation某些“必须”条件得到满足的方法。 请注意,您必须显式启用断言。

否则,您可以使用来自commons-lang的Validate 。 您只需编写Validate.notNull(foo) ,如果foonull ,则抛出exception。

断言未使用的主要原因是默认情况下未启用断言。 因此,如果您的条件非常重要,需要断言,则不能依赖启用断言来完成工作。

我同意断言的重大设计错误是它们默认是禁用的。

所以我说

 static { AssertionUtil.enableAssertionsForThisClass(); } 

在每个class级的顶部。 见http://commons.unkrig.de 。