0

在这个问题之后: 避免!= null 语句 我问我们的一位高级开发人员为什么不使用断言。虽然他的回答被证明是合理的(我们使用自定义异常),但他还声称断言是在开发和测试时使用的,而不是在生产中使用的。

但是在 Oracle 的文档 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 中,断言似乎是为了在测试之外使用,甚至考虑到禁用它们的可能性。

那么,有没有更好的理由或良好的做法不使用断言?

4

1 回答 1

0

断言的行为因语言而异。在 C 语言中,它们经常被错误地使用,而且错误的用法非常普遍,以至于许多人建议根本不要使用它们。它们不应该在生产中使用(即,C 的生产编译应该NDEBUG为预处理器定义),因为它们只会降低执行速度。

断言的目的是陈述逻辑必要性,而不是检查结果。例如,正确的(用 C 语言)写成:

f = malloc( s );
if( f == NULL ) {
   ...; exit( 1 );
}
assert( f != NULL );   # This is logically necessary.

但是写完全错误:

f = malloc( x );        # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert( f != NULL );    # DO NOT DO THIS

这实际上很有用,因为这样写是完全有效的:

f = xmalloc( x );
assert( f != NULL ); 

它作为向读者提供的文档,说明 xmalloc 的定义方式使其永远不会返回空值。

它们通常用于函数的开头:

void f( void *p ) { assert( p != NULL ); ... }

这种用法不是错误检查。相反,它用于指示函数f期望它永远不会被传递一个空指针。向开发人员传递空指针f是编程错误的文档。将其设为断言可以在启用断言时在运行时检测到错误。

于 2013-02-20T16:56:54.087 回答