关注此问题: Avoiding != null statements 我问我们的一位高级开发人员为什么不使用断言。虽然他的答案证明是合理的(我们使用自定义例外),但他也声称断言是在开发和测试时使用,但不是在生产中。
但在Oracle的文档中 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 看起来断言意味着在测试之外使用,更多的是考虑到禁用它们的可能性。
那么,有没有更好的理由或良好做法不使用断言?
答案 0 :(得分: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
是一个编程错误。使其成为断言可以在启用断言时在运行时检测错误。