ASSERT是在調(diào)試與測試環(huán)境,讓程序員和測試者及時發(fā)現(xiàn)運行時錯誤的極簡極佳之方法。
其語法如下:
在語法上,為了支持assertion,Java增加了一個關鍵字assert。它包括兩種表達式,分別如下:
- assert expression1;
- assert expression1: expression2;
在兩種表達式中,expression1表示一個boolean表達式,expression2表示一個基本類型或者是一個對象(Object) ,基本類型包括boolean,char,double,float,int和long。由于所有類都為Object的子類,因此這個參數(shù)可以用于所有對象。
在運行時,如果關閉了assertion功能,這些語句將不起任何作用。如果打開了assertion功能,那么expression1的值將被計算,如果它的值為false,該語句強拋出一個AssertionError對象。如果assertion語句包括expression2參數(shù),程序將計算出 expression2的結果,然后將這個結果作為AssertionError的構造函數(shù)的參數(shù),來創(chuàng)建AssertionError對象,并拋出該對象;如果expression1值為true,expression2將不被計算。
詳盡說明(點這里)。
它的語法因為簡單所以美麗。
注意它絕對不應用于發(fā)布和用戶使用環(huán)境,ASSERT就像蓋房子時的綠罩子、絞手架,在施工期間,防止石塊跌落,同時也有協(xié)助施工的作用。
JAVA源自C++,后者中被大力推廣的ASSERT,在JAVA里應該有十分的存在理由。ASSERT更象是一種編程方法和習慣,而不應該受到語言的局限。
做為JAVA程序員,應該非常慶幸:C++的ASSERT幾乎就真是一句“斷言”,單憑它,你只能知道錯了,而不知錯在何處。要在實際項目中使用它,幾乎都要用宏去重新定義,讓它帶有更多的調(diào)試信息,甚至是堆棧信息,做到這點還是需要些技巧的。而JAVA的ASSERT天生語法就可帶有可讀信息,并且自動拋出異常,我們可以方便看到堆棧。
有的文章攻擊ASSERT(點這里),是混淆了其使用目的的結果。
現(xiàn)在的IDE及WEB調(diào)試環(huán)境都可以方便的控制VM參數(shù),雖然JAVA可以選擇在發(fā)布版本也使用ASSERT,但JAVA本身也和C++一樣遵循默認不開啟它。你只需要在調(diào)試和測試的時候加上-ea(enable assertion)即可。
UNIT TEST并不能替代ASSERT。ASSERT是在真真正正實在的運行中產(chǎn)生作用,不同于單元測試中的MOCK框架或者函數(shù)級別的“驗證”測試。它著重于在整個系統(tǒng)運行時就將錯誤揪出來,試問單元測試能做到模擬整套系統(tǒng)運行嗎?
總之,ASSERT是前人多年編程過程中積累的工具和經(jīng)驗,我們應該多用它。以幾條摘自《高質(zhì)量C/C++編程指南》使用規(guī)則結束本文:
【規(guī)則6-5-1】使用斷言捕捉不應該發(fā)生的非法情況。不要混淆非法情況與錯誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
【規(guī)則6-5-2】在函數(shù)的入口處,使用斷言檢查參數(shù)的有效性(合法性)。
【建議6-5-1】在編寫函數(shù)時,要進行反復的考查,并且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對假定進行檢查。
【建議6-5-2】一般教科書都鼓勵程序員們進行防錯設計,但要記住這種編程風格可能會隱瞞錯誤。當進行防錯設計時,如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進行報警。
posted on 2008-05-30 11:54
我愛佳娃 閱讀(2082)
評論(3) 編輯 收藏 所屬分類:
JAVA基礎