




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、編程斷言概述編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設可以將 斷言看作是異常處理的一種高級形式斷言表示為一些布爾表達式,程序員相信在程序 中的某個特定點該表達式值為真可以在任何時候啟用和禁用斷言驗證,因此可以在測 試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時 可以重新起用斷言。使用斷言可以創建更穩定,品質更好且易于除錯的代碼當需要在一個值為false時 中斷當前操作的話,可以使用斷言單元測試必須使用斷言(junit/junitx)除了類型檢查和單元測試外,斷言還提供了一種確定個種特性是否在程序中得到維護 的極好的方法使用斷言使我們向按契約
2、式設計更近了一步常見的斷言特性前置條件斷言:代碼執行之前必須具備的特性后置條件斷言:代碼執行之后必須具備的特性前后不變斷言:代碼執行前后不能變化的特性斷言使用方式斷言可以有兩種形式lassertexpressionl2assertexpression 1:expression?其中expression!應該總是一個布爾值,expression?是斷言失敗時輸出的失敗消息的 字符串。如果expression!為假,則拋出一個assertionerror,這是一個錯誤,而不是 個異常,也就是說是一個不可控制異常(uncheckedexception),asseilioneitor由于 是錯誤,所以
3、可以不捕獲,但不推薦這樣做,因為那樣會使你的系統進入不穩定狀態。 啟用斷言斷言在默認情況下是關閉的,要在編譯時啟用斷言,需要使用source 14標記既 javacsource 14testjava,在運行時啟用斷占需要使用ea參數。要在系統類中啟用和禁用 斷言可以使用esa和dsa參數。例如:publicclassassertexampleonepublicassertexampleone() publicstaticvoidmain(stringargs) intx=10;systemoutprintln(mtestingassertionthatx= 100”); assertx=100
4、: houtassertionfailed!h;systemoutprintln(mtestpassed!n);如果編譯時未加-sourcel4,則編譯通不過 在執行時未加ea時輸出為testing assertionthatx= 100testpassed jre忽略了斷言的舊代碼,而使用了該參數就會輸出為testing assertionthatx= 100exceptioninthreadumain, javalang assertionerror:outassertionfailed! atassertexampleonemain(assertexampleonejava:6)斷言的副
5、作用由于程序員的問題,斷言的使用可能會帶來副作用,例如:boolea nisenable 二 false;/ assertisenable=true;這個斷言的副作用是因為它修改了程序中變量的值并且未拋出錯誤,這樣的錯誤如果 不細心的檢查是很難發現的。但是同時我們可以根據以上的副作用得到一個有用的特 性,根據它來測試斷言是否打開。publicclassassertexampletwof publicstaticvoidmain(stringargs) booleanisenab!e=false;/ assertisenable=true;if(isenable=false) thrownewr
6、untimeexception(hassertionshoulebee nable);何時需要使用斷言1可以在預計正常情況下程序不會到達的地方放置斷言:assertfalse2斷言可以用于檢查傳遞給私有方法的參數。(對于公有方法,因為是提供給外部的接 口,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性)3使用斷言測試方法執行的前置條件和后置條件4使用斷言檢查類的不變狀態,確保任何情況下,某個變量的狀態必須滿足。(如age 屬性應大于0小于某個合適值)什么地方不要使用斷言斷言語句不是永遠會執行,可以屏蔽也可以啟用因此:1不要使用斷言作為公共方法的參數檢查,公共方法的參數永遠都要執行2斷言語
7、句不可以有任何邊界效應,不要使用斷言語句去修改變量和改變方法的返冋 值下邊是介紹斷言的用法:assert是在j2se14中引入的新特性,assertion就是在代碼中包括的布爾型狀態,程序 員認為這個狀態是trueo 一般來說assert在開發的時候是檢查程序的安全性的,在發 布的時候通常都不使用asserto在14中添加了 assert關鍵字和javalangasserterror類 的支持。首先,我們有必要從一個例子說起assertpublicclassasserttestpublicstaticvoidmain(stringlargs)asserttestat=newasserttest
8、();atassertme(true);atassertme(false);privatevoidassertme(booleanboo)assertboo?true: false;systemoutprintln(mtruec on dition");程序中包含了 assert的話,你要用javac-sourcel4xxxjava m編譯,否則編譯器會報錯 的。要想讓assert得部分運行的話,要使用java-eaxxx來運行,否則包含assert得行 會被忽略。下面我們運行javac-source 14asserttesljavajava-eaasserttest看看結果的輸出是
9、:trueconditionexceptioninthread "main* javalang assertionerroratasserttestassertme(asserttestjava: 13)atasserttestmai n(asserttestjava:7)當我們運行atassertme(true)得時候,由于assertboo?true:false相當于asserttrue;因此沒 有任何問題,程序往下執行打印出truecondition,但是執行atassertme(false)的時候相 當于assertfalse,這個時候解釋器就會拋出assertionerro
10、r t »程序就終止了。大家必 須清楚assertionerror it繼承自error得,因此你可以不再程序屮catch它的,當然你 也可以在程序+ catch它然后程序可以繼續執行。例如:publicclass asserttestpublicstaticvoidmain(stringargs)asserttestat=newasserttest();tryatassertme(true);atassertme(false);catch(assertionerrorae)systemoutprintln(masserionterrorcatched");systemou
11、tprintln("goon");privatevoidassertme(booleanboo)assertboo?true:false;systemoutprintln("truec on dition");assert還有另外一種表達的方式,就是assertexpl:exp2;其中expl是個boolean返回值 得表達式,而exp2可以是原始的數據類型或者對象都可以例如:booleanboo=true;stringstr=null;assertboo=false: str="error"我們剛開始講得assertexpl得形式,
12、當expl是false得時候,assertionerror得默認構 造器會被調用,但是assertexpl :exp2這樣的形式,當expl為true的時候后而exp2被 或略,如果false的話,后面的表達式的結果會被計算出來并作為assertionerror得構 造器參數。看下而的例子:publicclass asserttestpublicstaticvoidmain(stringargs)asserttestat=newasserttest();atassertme(true);atassertme(false);privatevoidassertme(booleanboo)strin
13、gs 二 null;assertboo?true:false:s=hhelloworldk;systemoutprintln(mtruec on ditionn);運行的時候會得到這樣的結果trueconditionexception inthreadm main* javalang assertionerror: helloworld atasserttestassertme(asserttestjava: 14)atasserttestmain(asserttestjava:7)assert最好不要濫用,原因是assert并不一定都是enable的,下面兩種情況就不應該 用 assert不要再public的方法里面檢查參數是不是為null之類的操作例如 publicintget(strings)asserts!=null;如果需要檢查也最好通過ifs=null拋出nullpointerexception來檢查不要用assert檢查方法操作的返回值來判斷方法操作的結果例如assertiistremoveall();這樣看起來好像沒有問題但是想想如果assert被disable呢, 那樣他就不會被執行了所以removeallo操作就沒有被執行可以這樣代替 booleanboo=listremoveal();assertboo;就說這
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙草設備智能制造與大數據分析考核試卷
- 鹽行業競爭戰略與發展方向考核試卷
- 小學四年級數學四則運算練習題50道
- 7-3寄存器傳輸語言
- 洛陽商業職業學院《實驗診斷E》2023-2024學年第二學期期末試卷
- 四川省遂寧蓬溪縣聯考2024-2025學年初三5月中考模擬試題英語試題試卷含答案
- 四川輕化工大學《智能微電網控制技術》2023-2024學年第二學期期末試卷
- 內蒙古呼和浩特市賽罕區2025屆初三3月月考語文試題含解析
- 江西省鷹潭市余江區2024-2025學年三下數學期末檢測試題含解析
- 江西省彭澤縣湖西中學2024-2025學年普通高中教育教學質量監測考試(1月)生物試題含解析
- 兒童生長發育的健康監測與指導
- 鋪貨協議合同
- 物資設備管理試題及答案
- 車間生產追溯管理制度
- 2025年4月12日衢州事業單位及市直遴選(選調)筆試真題及答案解析
- 2025年CFA特許金融分析師考試全真模擬試題與解析
- 非上市公司的期權激勵方案兩篇
- 福建省能源石化集團有限責任公司招聘筆試真題2024
- 專業稅務顧問服務合同范本
- 第8課《集字練習》課件-【知識精研】六年級上冊書法北師大版
- DB37-T 5312-2025 《建筑施工安全防護設施技術標準》
評論
0/150
提交評論