2013-02-20 72 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

相關問題