I.網(wǎng)上關(guān)于斷言的資料
J2SE 1.4 在JAVA中新增添了assertion(斷言)功能。 最簡單的情形下,在JAVA代碼中任一行可以寫入一條布爾表達(dá)式,在這一行代碼的最前面加上assert關(guān)鍵字,就可以實現(xiàn)這樣的功能:如果表達(dá)式為真,則代碼繼續(xù)執(zhí)行;否則,拋出異常。為了實現(xiàn)這項功能, 在JAVA中新添加了assert關(guān)鍵字,AssertionError類, java.lang.ClassLoader中增加了幾個新的方法。
assertion功能提供了一種在代碼中進(jìn)行正確性檢查的機(jī)制,這種檢查通常用于開發(fā)和調(diào)試階段,到了軟件完成部署后就可以關(guān)閉。這使得程序員可以在代碼中加入調(diào)試檢查語句,同時又可以在軟件部署后關(guān)閉該功能而避免對軟件速度和內(nèi)存消耗的影響。基本上,assertion功能就是JAVA中的一種新的錯誤檢查機(jī)制,只不過這項功能可以根據(jù)需要關(guān)閉。
通常在C和C++中,斷言功能語句是可以通過預(yù)處理過程而不編譯進(jìn)最終的執(zhí)行代碼,由于JAVA中沒有宏功能,所以在以前的java版本中斷定功能沒有被廣泛的使用,在JDK1.4中通過增加assert關(guān)鍵字改變了這種狀況。
這項新功能最重要的特點(diǎn)是斷定語句可以在運(yùn)行時任意的開啟或關(guān)閉,這意味著這些起錯誤檢查功能的語句不必在開發(fā)過程結(jié)束后從源代碼中刪除。
assertion語法非常簡單,但正確的使用能幫助我們編寫出健壯(ROBAST)可靠的代碼。這篇文章中,我們不僅學(xué)習(xí)如何編寫assertion語句,更要討論應(yīng)該在什么情況下使用assertion語句。
一、assertion語法基本知識
我們可以用新的JAVA關(guān)鍵字assert來書寫斷定語句。一條斷定語句有以下兩種合法的形式:
assert expression1;
assert expression1 : expression2;
expression1是一條被判斷的布爾表達(dá)式,必須保證在程序執(zhí)行過程中它的值一定是真;expression2是可選的,用于在expression1為假時,傳遞給拋出的異常AssertionError的構(gòu)造器,因此expression2的類型必須是合法的AssertionError構(gòu)造器的參數(shù)類型。以下是幾條斷定語句的例子:
assert 0 < value;
assert ref != null;
assert count == (oldCount + 1);
assert ref.m1(parm);
assert關(guān)鍵字后面的表達(dá)式一定要是boolean類型,否則編譯時就會出錯。
以下是使用斷定語句的一個完整例子(見粗體語句行):
public class aClass {
public void aMethod( int value ) {
assert value >= 0;
System.out.println( "OK" );
}
public static void main( String[] args ){
aClass foo = new aClass();
System.out.print( "aClass.aMethod( 1 ): " );
foo.aMethod(1);
System.out.print( "aClass.aMethod( -1 ): " );
foo.aMethod( -1 );

}

}
這段程序通過語句 assert value >= 0; 來判斷傳入aMethod方法中的參數(shù)是否不小于0,如果傳入一個負(fù)數(shù),則會觸發(fā)AssertionError的異常。
為了和J2SE 1.4 以前的程序兼容,在JDK1.4 中的javac 和 java 命令在默認(rèn)情況下都是關(guān)閉assertion功能的,即不允許使用assert作為關(guān)鍵字,這就保證了如果你以前編寫的程序中如果使用了assert作為變量名或是方法名,程序不必修改仍然可以運(yùn)行。但需要注意的是,這些程序是無法使用JDK1.4 的javac進(jìn)行重新編譯的,只能使用JDK1.3或之前的版本編譯。為了編譯我們前面寫的小程序,首先要使用符合J2SE 1.4 的編譯器,同時還要使用幾個命令行參數(shù)來使編譯器啟用assertion功能。
使用以下的命令來編譯aClass.java:
javac -source 1.4 aClass.java
如果我們使用java aClass 來運(yùn)行這段程序,就會發(fā)現(xiàn)assertion語句實際上并未得到執(zhí)行,和javac一樣,java命令在默認(rèn)情況下,關(guān)閉了assertion功能,因而會忽略assertion語句。如何啟用assertion語句將在下一節(jié)討論。
二、通過命令行控制assertion功能
assertion語句的一項最重要的特點(diǎn)是它可以被關(guān)閉,關(guān)閉的作用是這條代碼雖然仍存在于程序當(dāng)中,但程序運(yùn)行時,JVM會忽略它的存在,不予執(zhí)行,這樣代碼的運(yùn)行速度不會由于assertion語句的存在而受到影響,如果代碼執(zhí)行過程中出現(xiàn)了問題,我們又可以啟用assertion語句,幫助我們進(jìn)行分析判斷。默認(rèn)情況下,這項功能是關(guān)閉的。(提示:本小節(jié)介紹的命令行參數(shù)都是針對SUN提供的JDK1.4而言,如果使用其他公司的JDK則未必會完全一樣。)
JDK1.4 中,通過java命令的命令行選項 -ea (-enableassertions 的縮寫)來啟用。以下兩個命令是等效的:
java -ea myPackage.myProgram
java -enableassertions myPackage.myProgram
同樣,我們通過 -da (-disableassertions 的縮寫)來關(guān)閉assertion功能:
java -da myPackage.myProgram
java -disableassertions myPackage.myProgram
assertion功能還可以針對特定的包(package)或類(class)分別啟用和關(guān)閉。針對類時,使用完整的類名;針對包時,包名后面緊跟“...”:
java -ea:<class> myPackage.myProgram
java -da:<package>... myPackage.myProgram
在一個java命令中使用多項 -ea -da 參數(shù)時,后面的參數(shù)設(shè)定會覆蓋前面參數(shù)的設(shè)定,比如我們可以默認(rèn)啟用所有的assertion功能,但針對特定的包卻關(guān)閉此功能:
java -ea -da:<package>... myPackage.myProgram
對于未命名的包(位于當(dāng)前目錄中)都屬于默認(rèn)包,可以使用以下的命令控制:
java -ea:... myPackage.myProgram
java -da:... myPackage.myProgram
對于隨JVM安裝時自己附帶的所有系統(tǒng)類,可以分別使用 -esa(-enablesystemassertions)和-dsa(-disablesystemassertions)來控制assertion功能的啟用和關(guān)閉。在表1.1中列出了控制assertion功能參數(shù)的所有用法。
表1 JDK1.4 中java命令和assertion功能有關(guān)的命令行參數(shù)
命令行參數(shù) 實例 含義
-ea Java -ea 啟用除系統(tǒng)類外所有類的assertion
-da
Java -da 關(guān)閉除系統(tǒng)類外所有類的assertion
-ea:<classname>
Java -ea:AssertionClass 啟用AssertionClass類的assertion
-da:<classname>
Java -da:AssertionClass 關(guān)閉AssertionClass類的assertion
-ea:<packagename> Java -ea:pkg0... 啟用pkg0包的assertion
-da:<packagename> Java -da:pkg0... 關(guān)閉pkg0包的assertion
-esa
Java -esa 啟用系統(tǒng)類中的assertion
-dsa
Java -dsa 關(guān)閉系統(tǒng)類中的assertion
至此,我們前面編寫的小程序aClass可以用以下的任意命令運(yùn)行:
java -ea aClass
java -ea:aClass aClass
java -ea:... aClass
運(yùn)行結(jié)果如下:
aClass.aMethod( 1 ): OK
aClass.aMethod( -1 ): java.lang.AssertionError
at aClass.aMethod(aClass.java:3)
at aClass.main(aClass.java:12)
Exception in thread "main"
三、assertion命令行參數(shù)之間的繼承關(guān)系
assertion功能的啟用和關(guān)閉可以一直控制到每一個類,一個命令行可以容納任意多個-ea -da 參數(shù),這些參數(shù)之間是如何相互起作用的,基本上遵循兩個原則:特定具體的設(shè)定優(yōu)先于一般的設(shè)定,后面的?設(shè)定優(yōu)先于前面的設(shè)定。我們看下面的例子:
// Base.java

package tmp;

public class Base{

public void m1( boolean test ){

assert test : "Assertion failed: test is " + test;

System.out.println( "OK" );

}

}

// Derived.java

//

package tmp.sub;

import tmp.Base;

public class Derived extends Base{

public void m2( boolean test ){

assert test : "Assertion failed: test is " + test;

System.out.println( "OK" );

}

public static void printAssertionError( AssertionError ae ){

StackTraceElement[] stackTraceElements = ae.getStackTrace();

StackTraceElement stackTraceElement = stackTraceElements[ 0 ];

System.err.println( "AssertionError" );

System.err.println( " class= " + stackTraceElement.getClassName() );

System.err.println( " method= " + stackTraceElement.getMethodName() );

System.err.println( " message= " + ae.getMessage() );

}

public static void main( String[] args ){

try{

Derived derived = new Derived();

System.out.print( "derived.m1( false ): " );

derived.m1( false );

System.out.print( "derived.m2( false ): " );

derived.m2( false );

}catch( AssertionError ae ){

printAssertionError( ae );

}

}

}
II.eclipse中最簡單使用assert的配置

這樣你就可以在開發(fā)期間使用assert了
J2SE 1.4 在JAVA中新增添了assertion(斷言)功能。 最簡單的情形下,在JAVA代碼中任一行可以寫入一條布爾表達(dá)式,在這一行代碼的最前面加上assert關(guān)鍵字,就可以實現(xiàn)這樣的功能:如果表達(dá)式為真,則代碼繼續(xù)執(zhí)行;否則,拋出異常。為了實現(xiàn)這項功能, 在JAVA中新添加了assert關(guān)鍵字,AssertionError類, java.lang.ClassLoader中增加了幾個新的方法。
assertion功能提供了一種在代碼中進(jìn)行正確性檢查的機(jī)制,這種檢查通常用于開發(fā)和調(diào)試階段,到了軟件完成部署后就可以關(guān)閉。這使得程序員可以在代碼中加入調(diào)試檢查語句,同時又可以在軟件部署后關(guān)閉該功能而避免對軟件速度和內(nèi)存消耗的影響。基本上,assertion功能就是JAVA中的一種新的錯誤檢查機(jī)制,只不過這項功能可以根據(jù)需要關(guān)閉。
通常在C和C++中,斷言功能語句是可以通過預(yù)處理過程而不編譯進(jìn)最終的執(zhí)行代碼,由于JAVA中沒有宏功能,所以在以前的java版本中斷定功能沒有被廣泛的使用,在JDK1.4中通過增加assert關(guān)鍵字改變了這種狀況。
這項新功能最重要的特點(diǎn)是斷定語句可以在運(yùn)行時任意的開啟或關(guān)閉,這意味著這些起錯誤檢查功能的語句不必在開發(fā)過程結(jié)束后從源代碼中刪除。
assertion語法非常簡單,但正確的使用能幫助我們編寫出健壯(ROBAST)可靠的代碼。這篇文章中,我們不僅學(xué)習(xí)如何編寫assertion語句,更要討論應(yīng)該在什么情況下使用assertion語句。
一、assertion語法基本知識
我們可以用新的JAVA關(guān)鍵字assert來書寫斷定語句。一條斷定語句有以下兩種合法的形式:
assert expression1;
assert expression1 : expression2;
expression1是一條被判斷的布爾表達(dá)式,必須保證在程序執(zhí)行過程中它的值一定是真;expression2是可選的,用于在expression1為假時,傳遞給拋出的異常AssertionError的構(gòu)造器,因此expression2的類型必須是合法的AssertionError構(gòu)造器的參數(shù)類型。以下是幾條斷定語句的例子:
assert 0 < value;
assert ref != null;
assert count == (oldCount + 1);
assert ref.m1(parm);
assert關(guān)鍵字后面的表達(dá)式一定要是boolean類型,否則編譯時就會出錯。
以下是使用斷定語句的一個完整例子(見粗體語句行):
















這段程序通過語句 assert value >= 0; 來判斷傳入aMethod方法中的參數(shù)是否不小于0,如果傳入一個負(fù)數(shù),則會觸發(fā)AssertionError的異常。
為了和J2SE 1.4 以前的程序兼容,在JDK1.4 中的javac 和 java 命令在默認(rèn)情況下都是關(guān)閉assertion功能的,即不允許使用assert作為關(guān)鍵字,這就保證了如果你以前編寫的程序中如果使用了assert作為變量名或是方法名,程序不必修改仍然可以運(yùn)行。但需要注意的是,這些程序是無法使用JDK1.4 的javac進(jìn)行重新編譯的,只能使用JDK1.3或之前的版本編譯。為了編譯我們前面寫的小程序,首先要使用符合J2SE 1.4 的編譯器,同時還要使用幾個命令行參數(shù)來使編譯器啟用assertion功能。
使用以下的命令來編譯aClass.java:
javac -source 1.4 aClass.java
如果我們使用java aClass 來運(yùn)行這段程序,就會發(fā)現(xiàn)assertion語句實際上并未得到執(zhí)行,和javac一樣,java命令在默認(rèn)情況下,關(guān)閉了assertion功能,因而會忽略assertion語句。如何啟用assertion語句將在下一節(jié)討論。
二、通過命令行控制assertion功能
assertion語句的一項最重要的特點(diǎn)是它可以被關(guān)閉,關(guān)閉的作用是這條代碼雖然仍存在于程序當(dāng)中,但程序運(yùn)行時,JVM會忽略它的存在,不予執(zhí)行,這樣代碼的運(yùn)行速度不會由于assertion語句的存在而受到影響,如果代碼執(zhí)行過程中出現(xiàn)了問題,我們又可以啟用assertion語句,幫助我們進(jìn)行分析判斷。默認(rèn)情況下,這項功能是關(guān)閉的。(提示:本小節(jié)介紹的命令行參數(shù)都是針對SUN提供的JDK1.4而言,如果使用其他公司的JDK則未必會完全一樣。)
JDK1.4 中,通過java命令的命令行選項 -ea (-enableassertions 的縮寫)來啟用。以下兩個命令是等效的:
java -ea myPackage.myProgram
java -enableassertions myPackage.myProgram
同樣,我們通過 -da (-disableassertions 的縮寫)來關(guān)閉assertion功能:
java -da myPackage.myProgram
java -disableassertions myPackage.myProgram
assertion功能還可以針對特定的包(package)或類(class)分別啟用和關(guān)閉。針對類時,使用完整的類名;針對包時,包名后面緊跟“...”:
java -ea:<class> myPackage.myProgram
java -da:<package>... myPackage.myProgram
在一個java命令中使用多項 -ea -da 參數(shù)時,后面的參數(shù)設(shè)定會覆蓋前面參數(shù)的設(shè)定,比如我們可以默認(rèn)啟用所有的assertion功能,但針對特定的包卻關(guān)閉此功能:
java -ea -da:<package>... myPackage.myProgram
對于未命名的包(位于當(dāng)前目錄中)都屬于默認(rèn)包,可以使用以下的命令控制:
java -ea:... myPackage.myProgram
java -da:... myPackage.myProgram
對于隨JVM安裝時自己附帶的所有系統(tǒng)類,可以分別使用 -esa(-enablesystemassertions)和-dsa(-disablesystemassertions)來控制assertion功能的啟用和關(guān)閉。在表1.1中列出了控制assertion功能參數(shù)的所有用法。
表1 JDK1.4 中java命令和assertion功能有關(guān)的命令行參數(shù)
命令行參數(shù) 實例 含義
-ea Java -ea 啟用除系統(tǒng)類外所有類的assertion
-da
Java -da 關(guān)閉除系統(tǒng)類外所有類的assertion
-ea:<classname>
Java -ea:AssertionClass 啟用AssertionClass類的assertion
-da:<classname>
Java -da:AssertionClass 關(guān)閉AssertionClass類的assertion
-ea:<packagename> Java -ea:pkg0... 啟用pkg0包的assertion
-da:<packagename> Java -da:pkg0... 關(guān)閉pkg0包的assertion
-esa
Java -esa 啟用系統(tǒng)類中的assertion
-dsa
Java -dsa 關(guān)閉系統(tǒng)類中的assertion
至此,我們前面編寫的小程序aClass可以用以下的任意命令運(yùn)行:
java -ea aClass
java -ea:aClass aClass
java -ea:... aClass
運(yùn)行結(jié)果如下:
aClass.aMethod( 1 ): OK
aClass.aMethod( -1 ): java.lang.AssertionError
at aClass.aMethod(aClass.java:3)
at aClass.main(aClass.java:12)
Exception in thread "main"
三、assertion命令行參數(shù)之間的繼承關(guān)系
assertion功能的啟用和關(guān)閉可以一直控制到每一個類,一個命令行可以容納任意多個-ea -da 參數(shù),這些參數(shù)之間是如何相互起作用的,基本上遵循兩個原則:特定具體的設(shè)定優(yōu)先于一般的設(shè)定,后面的?設(shè)定優(yōu)先于前面的設(shè)定。我們看下面的例子:









































































II.eclipse中最簡單使用assert的配置

這樣你就可以在開發(fā)期間使用assert了