|
发表于 2006-6-14 01:15:00
|
显示全部楼层
<DIV 8px; PADDING-LEFT: 8px; PADDING-BOTTOM: 8px; WIDTH: 100%; PADDING-TOP: 8px" align=left>應該是指不要將斷言作為程式邏輯的一部份,除了判斷程式中某點情況或值的判斷之外,assert不作其它的用途。。。
例如一個使用斷言的時機是內部不變量(Internal invarant)的判斷,例如在某個時間點上,或某個狀況發生時,您判斷某個變數必然要是某個值,舉個例子來說:
<UL><LI>AssertionDemo.java</LI></UL><PRE>public class AssertionDemo {
public static void main(String[] args) {
if(args.length > 0) {
System.out.println(args[0]);
}
else {
assert args.length == 0;
System.out.println("沒有輸入引數");
}
}
}</PRE>
在正常的預期中,陣列長度是不會小於0的,所以一但執行至else區塊,陣列長度必然只有一個可能,就是等於0,您斷言args.length==0結果必然成立,else之中的程式碼也只有在斷言成立的狀況下才能執行,如果不成立,表示程式運行存在錯誤,else區塊不應被執行,您要停下來檢查程式的錯誤,事實上斷言主要的目的通常是在開發時期才使用。
另一個使用斷言的時機為控制流程不變量(Control flow invariant)的判斷,例如在使用switch時,假設您已經列出了所有的可能常數:
<DIV 40px">...<BR bold; FONT-FAMILY: Courier New,Courier,monospace">switch(var) {<BR bold; FONT-FAMILY: Courier New,Courier,monospace">case Constants.Con1:<BR bold; FONT-FAMILY: Courier New,Courier,monospace">...<BR bold; FONT-FAMILY: Courier New,Courier,monospace">break;<BR bold; FONT-FAMILY: Courier New,Courier,monospace">case Constants.Con2:<BR bold; FONT-FAMILY: Courier New,Courier,monospace">...<BR bold; FONT-FAMILY: Courier New,Courier,monospace">break;<BR bold; FONT-FAMILY: Courier New,Courier,monospace">case Constants.Con3:<BR bold; FONT-FAMILY: Courier New,Courier,monospace">...<BR bold; FONT-FAMILY: Courier New,Courier,monospace">break;<BR bold; FONT-FAMILY: Courier New,Courier,monospace">default:<BR bold; FONT-FAMILY: Courier New,Courier,monospace">assert false : "非定義的常數";<BR bold; FONT-FAMILY: Courier New,Courier,monospace">}<BR bold; FONT-FAMILY: Courier New,Courier,monospace">...
</DIV>
假設您已經在switch中列出了所有的常數,即var不該出現Constants.Con1、Constants.Con2、 Constants.Con3以外的常數,則如果發生default被執行的情況,表示程式的狀態與預期不符,此時由於assert false必然斷言失敗。
總結就是,斷言是判定程式中的某個執行點必然是某個狀態,所以它不能當作像if之類的判斷式使用,簡單的說它不應是程式執行流程的一部份。
</DIV><P><FONT size=2><FONT color=#00648a>參考資料</FONT>
</FONT>http://caterpillar.onlyfun.net </P> |
|