2013-02-20 34 views
0

下面这个问题: Avoiding != null statements 我问我们的一位高级开发人员为什么不使用断言。虽然他的答案证明是合理的(我们使用自定义例外),但他也声称断言是用于开发和测试,但不是用于生产。断言可以用于生产还是仅用于开发?

但甲骨文的文档 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 它看起来像断言意味着超越测试使用,更给禁用它们的可能性英寸

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

回答

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的文档是编程错误。使它成为断言可以在启用断言时在运行时检测到错误。

+0

我猜在使用断言时,C和Java有一些差异。它也在该文档页面中说过“不要在公共方法中使用断言进行参数检查”。 – 2013-02-20 17:07:14

相关问题