本文目錄一覽:
- 1、Java開發中什麼時候使用斷言?
- 2、在Java中怎麼使用斷言
- 3、程序設計裡面的斷言是什麼???Java裡面的assert,assert.h又是什麼???
- 4、java中的斷言問題
- 5、高級Java斷言的用途?
- 6、Java中斷言的用法
Java開發中什麼時候使用斷言?
Myeclipse中單元測試斷言例子:
首先,建立Web Project,工程名為:JunitDemo,我選擇的是Java EE 5。
然後建立包,包名為:demotest。
其次,在包下面建立一個Java CLass,也就是Java類,類名為:JunitDemo
下一步是在JunitDemo.java上面點擊右鍵—-NEW—-OTHER,然後找到Java——JUint,然后里面就選擇JUint Test Case。
如圖:
這裡,setup和teardown打上勾。
包就選擇demotest,這樣就和JuintDemo在一個包下面,Name就寫 JunitDemoTest,好了。點擊FINISH完成。,這個過程中就會自動安裝Junit 3的包。
JunitDemoTest.java的內容為:
package demotest;
import junit.framework.TestCase;
public class JunitDemoTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testReturnstring() {
JunitDemo jd = new JunitDemo();
this.assertEquals(“I’m good”, jd.returnstring());
}
public static void main(String args[]){
System.out.println(“測試環境。”);
}
}
然後就是RUN as- — Junit Test。這是看結果就好了,進度條為綠色就表示為,通過了,紅色就是沒有通過。
如圖:
在Java中怎麼使用斷言
如果要開啟斷言檢查,則需要用開關-enableassertions或-ea來開啟。
assert關鍵字語法很簡單,有兩種用法:
1、assert boolean表達式
如果boolean表達式為true,則程序繼續執行。
如果為false,則程序拋出AssertionError,並終止執行。
2、assert boolean表達式 : 錯誤信息表達式
如果boolean表達式為true,則程序繼續執行。
如果為false,則程序拋出java.lang.AssertionError,並輸入錯誤信息表達式。
三、應用實例
下面給出一個例子,通過例子說明其用法:
public class AssertFoo {
public static void main(String args[]) {
//斷言1結果為true,則繼續往下執行
assert true;
System.out.println(“斷言1沒有問題,Go!”);
System.out.println(“\n—————–\n”);
//斷言2結果為false,程序終止
assert false : “斷言失敗,此表達式的信息將會在拋出異常的時候輸出!”;
System.out.println(“斷言2沒有問題,Go!”);
}
}
保存代碼到C:\AssertFoo.java,然後按照下面的方式執行,查看控制台輸出結果:
1、編譯程序:
C:\javac AssertFoo.java
2、默認執行程序,沒有開啟-ea開關:
C:\java AssertFoo
斷言1沒有問題,Go!
—————–
斷言2沒有問題,Go!
3、開啟-ea開關,執行程序:
C:\java -ea AssertFoo
斷言1沒有問題,Go!
—————–
Exception in thread “main” java.lang.AssertionError: 斷言失敗,此表達式的信息將
會在拋出異常的時候輸出!
at AssertFoo.main(AssertFoo.java:10)
四、陷阱
assert關鍵字用法簡單,但是使用assert往往會讓你陷入越來越深的陷阱中。應避免使用。筆者經過研究,總結了以下原因:
1、assert關鍵字需要在運行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。而現在主流的Java IDE工具默認都沒有開啟-ea斷言檢查功能。這就意味着你如果使用IDE工具編碼,調試運行時候會有一定的麻煩。並且,對於Java Web應用,程序代碼都是部署在容器裡面,你沒法直接去控制程序的運行,如果一定要開啟-ea的開關,則需要更改Web容器的運行配置參數。這對程序的移植和部署都帶來很大的不便。
2、用assert代替if是陷阱之二。assert的判斷和if語句差不多,但兩者的作用有着本質的區別:assert關鍵字本意上是為測試調試程序時使用的,但如果不小心用assert來控制了程序的業務流程,那在測試調試結束後去掉assert關鍵字就意味着修改了程序的正常的邏輯。
3、assert斷言失敗將面臨程序的退出。這在一個生產環境下的應用是絕不能容忍的。一般都是通過異常處理來解決程序中潛在的錯誤。但是使用斷言就很危險,一旦失敗系統就掛了。
五、對assert的思考
assert既然是為了調試測試程序用,不在正式生產環境下用,那應該考慮更好的測試JUint來代替其做用,JUint相對assert關鍵的所提供的功能是有過之而無不及。當然完全可以通過IDE debug來進行調試測試。在此看來,assert的前途一片昏暗。
因此,應當避免在Java中使用assert關鍵字,除非哪一天Java默認支持開啟-ea的開關,這時候可以考慮。對比一下,assert能給你帶來多少好處,多少麻煩,這是我們選擇是否使用的的原則。
以上僅僅代表我個人觀點,歡迎大家留言討論。
———————————————————————————–
下面是一些Assert的例子:
assert 0 value;
assert 0 value:”value=”+value;
assert ref != null:”ref doesn”t equal null”;
assert isBalanced();
———————————————————————————–
AssertinError類是Error的直接子類,因此代表程序出現了嚴重的錯誤,這種異常通常是不需要程序員使用catch語句捕捉的。
使用assert的準則:assert語句的作用是保證程序內部的一致性,而不是用戶與程序之間的一致性,所以不應用在保證命令行參數的正確性。可以用來保證傳遞給private方法參數的正確性。因為私有方法只是在類的內部被調用,因而是程序員可以控制的,我們可以預期它的狀態是正確和一致的。公有方法則不適用。此外,assert語句可用於檢查任何方法結束時狀態的正確性,及在方法的開始檢查相關的初始狀態 等等。
assert語句並不構成程序正常運行邏輯的一部分,時刻記住在運行時它們可能不會被執行。
———————————————————————————–
兩類參數:
參數 -esa和 -dsa:
它們含義為開啟(關閉)系統類的assertion功能。由於新版本的Java的系統類中,也使了 assertion語句,因此如果用戶需要觀察它們的運行情況,就需要打開系統類的assertion功能 ,我們可使用-esa參數打開,使用 -dsa參數關閉。 -esa和-dsa的全名為-enablesystemassertions和-disenablesystemassertions,全名和縮寫名有同樣的功能。
參數 -ea和 -ea:
它們含義為開啟(關閉)用戶類的assertion功能:通過這個參數,用戶可以打開某些類或包的assertion功能,同樣用戶也可以關閉某些類和包的assertion功能。打開assertion功能參數為-ea;如果不帶任何參數,表示打開所有用戶類;如果帶有包名稱或者類名稱,表示打開這些類或包;如果包名稱後面跟有三個點,代表這個包及其子包;如果只有三個點,代表無名包。關閉 assertion功能參數為-da,使用方法與-ea類似。
-ea和-da的全名為-enableassertions和-disenableassertions,全名和縮寫名有同樣的功能。
下面表格表示了參數及其含義,並有例子說明如何使用。
參數 例子 說明
-ea java -ea 打開所有用戶類的assertion
-da java -da 關閉所有用戶類的assertion
-ea: java -ea:MyClass1 打開MyClass1的assertion
-da: java -da: MyClass1 關閉MyClass1的assertion
-ea: java -ea:pkg1 打開pkg1包的assertion
-da: java -da:pkg1 關閉pkg1包的assertion
-ea:… java -ea:… 打開缺省包(無名包)的assertion
-da:… java -da:… 關閉缺省包(無名包)的assertion
-ea:… java -ea:pkg1… 打開pkg1包和其子包的assertion
-da:… java -da:pkg1… 關閉pkg1包和其子包的assertion
-esa java -esa 打開系統類的assertion
-dsa java -dsa 關閉系統類的assertion
———————————————————————————–
不要再public的方法裡面檢查參數是不是為null之類的操作,例如:
public int get(String s){
assert s != null;
}
如果需要檢查也最好通過 if s = null 拋出 NullPointerException來檢查。
不要用assert來檢查方法操作的返回值來判斷方法操作的結果,例如:
assert list.removeAll();這樣看起來好像沒有問題 但是想想如果assert 被disable呢,那樣他就不會被執行了,所以removeAll()操作就沒有被執行,可以這樣代替
boolean boo = list.removeAl();
assert boo;
———————————————————————————–
另外,Java為了讓程序也能夠動態開啟和關閉某些類和包的assertion功能,Java修該了Class和ClassLoader的實現,增加了幾個用於操作assert的API。下面簡單說明一下幾個API的作用。
ClassLoader類中的幾個相關的API:
setDefaultAssertionStatus:用於開啟/關閉assertion功能
setPackageAssertionStatus:用於開啟/關閉某些包的assertion功能
setClassAssertionStatus: 用於開啟/關閉某些類的assertion功能
clearAssertionStatus:用於關閉assertion功能
程序設計裡面的斷言是什麼???Java裡面的assert,assert.h又是什麼???
(一)首先明確:
java斷言Assert是jdk1.4引入的。
jvm 斷言默認是關閉的。
斷言是可以局部開啟的,如:父類禁止斷言,而子類開啟斷言,所以一般說“斷言不具有繼承性”。
斷言只適用於複雜的調試過程。
斷言一般用於程序執行結果的判斷,千萬不要讓斷言處理業務流程。
(二)判斷eclipse是否開啟了斷言,代碼如下:
public class AssertTest {
public static void main(String[] args) {
boolean isOpen = false;
assert isOpen=true; //如果開啟了斷言,會將isOpen的值改為true
System.out.println(isOpen);//打印是否開啟了斷言
}
}
執行上面代碼,如果打印 true說明已經啟用了斷言,如果為 false 則沒有啟用斷言。
如果沒有啟用斷言,則按按照下面方法開啟斷言。
(三)eclipse中開啟斷言
選擇菜單:Run — Run… — 選擇 Arguments 選項卡
在 VM arguments 文本框中輸入: -ea 注意 中間沒有空格,如果輸入 -da 表示禁止斷言。
然後關閉該窗口,提示保存,然後保存就開啟了斷言。如下圖:
再次執行第二步操作,如果打印true,說明開啟斷言成功。
如果禁止斷言,則按第二步操作中,刪除 -ea 或者將 -ea 改為 -da 即可。
(四)斷言使用
第 1 種使用方法:
public static void main(String[] args) {
boolean isOk = 12;
assert isOk;
System.out.println(“程序正常”);
}
因為 12 顯然是錯誤的,所以執行結果拋出異常:Exception in thread “main” java.lang.AssertionError
如果把 12 改為 12 則程序能順利執行,打印 “程序正常”
第 2 種使用方法:
public static void main(String[] args) {
boolean isOk = 12;
try{
assert isOk : “程序錯誤”;
System.out.println(“程序正常”);
}catch(AssertionError err){
System.out.println(err.getMessage());
}
}
assert 後面跟個冒號表達式。如果冒號前為 true,則冒號後面的被忽略。
如果冒號前為false,則拋出AssertionError , 錯誤信息內容為冒號後面的內容,上面程序執行結果就是打印:”程序錯誤”
(五)有關斷言的更多參數:
-ea java -ea 打開所有用戶類的assertion
-da java -da 關閉所有用戶類的assertion
-ea:classname java -ea:MyClass1 打開MyClass1的assertion
-da:classname java -da: MyClass1 關閉MyClass1的assertion
-ea:packagename java -ea:pkg1 打開pkg1包的assertion
-da:packagename java -da:pkg1 關閉pkg1包的assertion
-ea:… java -ea:… 打開缺省包(無名包)的assertion
-da:… java -da:… 關閉缺省包(無名包)的assertion
-ea:packagename… java -ea:pkg1… 打開pkg1包和其子包的assertion
-da:packagename… java -da:pkg1… 關閉pkg1包和其子包的assertion
-esa java -esa 打開系統類的assertion
-dsa java -dsa 關閉系統類的assertion
綜合使用 java -dsa:MyClass1:pkg1 關閉MyClass1和pkg1包的assertion
java中的斷言問題
下面介紹一下斷言在JAVA中的使用,JAVA是從JDK1.4才開始支持斷言的(添加了關鍵字assert),請注意老版的JRE不支持。
斷言概述
編寫代碼時,我們總是會做出一些假設,斷言就是用於在代碼中捕捉這些假設
可以將斷言看作是異常處理的一種高級形式
斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真
可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行後,最終用戶在遇到問題時可以重新起用斷言。
使用斷言可以創建更穩定,品質更好且易於除錯的代碼
當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言
單元測試必須使用斷言(Junit/JunitX)
除了類型檢查和單元測試外,斷言還提供了一種確定個種特性是否在程序中得到維護的極好的方法
使用斷言使我們向按契約式設計更近了一部
常見的斷言特性
前置條件斷言:代碼執行之前必須具備的特性
後置條件斷言:代碼執行之後必須具備的特性
前後不變斷言:代碼執行前後不能變化的特性
斷言使用方式
斷言可以有兩種形式
1.assert Expression1
2.assert Expression1:Expression2
其中Expression1應該總是一個布爾值,Expression2是斷言失敗時輸出的失敗消息的字符串。如果Expression1為假,則拋出一個 AssertionError,這是一個錯誤,而不是一個異常,也就是說是一個不可控制異常(unchecked Exception),AssertionError由於是錯誤,所以可以不捕獲,但不推薦這樣做,因為那樣會使你的系統進入不穩定狀態。
起用斷言
斷言在默認情況下是關閉的,要在編譯時啟用斷言,需要使用source1.4標記 既javac source1.4 Test.java ,在運行時啟用斷言需要使用 -ea參數 。要在系統類中啟用和禁用斷言可以使用 -esa 和 -dsa參數。
例如:
public class AssertExampleOne{
public AssertExampleOne(){}
public static void main(String args[]){
int x=10;
System.out.println(“Testing Assertion that x==100”);
assert x=100;”Out assertion failed!”;
System.out.println(“Test passed!”);
}
}
如果編譯時未加 -source1.4,則編譯通不過
在執行時未加 -ea 時輸出為
Testing Assertion that x==100
Test passed
jre忽略了斷言的就代碼,而使用了該參數就會輸出為
Testing Assertion that x==100
Exception in thread “main” java.lang.AssertionError: Out assertion failed!
at AssertExampleOne.main(AssertExampleOne.java:6)
斷言的副作用
由於程序員的問題,斷言的使用可能會帶來副作用 ,例如:
boolean isEnable=false;
//…
assert isEnable=true;
這個斷言的副作用是因為它修改了程序中變量的值並且未拋出錯誤,這樣的錯誤如果不細心的檢查是很難發現的。但是同時我們可以根據以上的副作用得到一個有用的特性,根據它來測試斷言是否打開。
public class AssertExampleTwo{
public static void main(String args[]){
boolean isEnable=false;
//…
assert isEnable=true;
if(isEnable==false){
throw new RuntimeException(“Assertion shoule be enable!”);
}
}
}
何時需要使用斷言
1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false
2.斷言可以用於檢查傳遞給私有方法的參數。(對於公有方法,因為是提供給外部的接口,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性)
3.使用斷言測試方法執行的前置條件和後置條件
4.使用斷言檢查類的不變狀態,確保任何情況下,某個變量的狀態必須滿足。(如age屬性應大於0小於某個合適值)
什麼地方不要使用斷言
斷言語句不是永遠會執行,可以屏蔽也可以啟用
因此:
1.不要使用斷言作為公共方法的參數檢查,公共方法的參數永遠都要執行
2.斷言語句不可以有任何邊界效應,不要使用斷言語句去修改變量和改變方法的返回值
下邊是介紹斷言的用法:
assert是在J2SE1.4中引入的新特性,assertion就是在代碼中包括的布爾型狀態,程序員認為這個狀態是true。一般來說assert在開發的時候是檢查程序的安全性的,在發布的時候通常都不使用assert。在1.4中添加了assert關鍵字和java.lang.AssertError類的支持。
首先,我們有必要從一個例子說起assert
public class AssertTest
{
public static void main(String[] args)
{
AssertTest at = new AssertTest();
at.assertMe(true);
at.assertMe(false);
}
private void assertMe(boolean boo)
{
assert boo?true:false;
System.out.println(“true condition”);
}
}
程序中包含了assert的話,你要用javac -source 1.4 xxx.java來編譯,否則編譯器會報錯的。要想讓assert得部分運行的話,要使用java -ea xxx來運行,否則包含assert得行會被忽略。下面我們運行
javac -source 1.4 AssertTest.java
java -ea AssertTest
看看結果的輸出是:
true condition
Exception in thread “main” java.lang.AssertionError
at AssertTest.assertMe(AssertTest.java:13)
at AssertTest.main(AssertTest.java:7)
當我們運行at.assertMe(true)得時候,由於assert boo?true:false相當於 assert true;因此沒有任何問題,程序往下執行打印出true condition,但是執行at.assertMe(false)的時候相當於assert false,這個時候解釋器就會拋出AssertionError了,程序就終止了。大家必須清楚AssertionError是繼承自Error得,因此你可以不再程序中catch它的,當然你也可以在程序中catch它然後程序可以繼續執行。例如:
public class AssertTest
{
public static void main(String[] args)
{
AssertTest at = new AssertTest();
try
{
at.assertMe(true);
at.assertMe(false);
}
catch(AssertionError ae)
{
System.out.println(“AsseriontError catched”);
}
System.out.println(“go on”);
}
private void assertMe(boolean boo)
{
assert boo?true:false;
System.out.println(“true condition”);
}
}
assert還有另外一種表達的方式,就是assert exp1:exp2;其中exp1是個boolean返回值得表達式,而exp2可以是原始的數據類型或者對象都可以例如:
boolean boo = true;
String str = null;
assert boo = false:str=”error”;
我們剛開始講得assert exp1得形式,當exp1是false得時候,AssertionError得默認構造器會被調用,但是assert exp1:exp2這樣的形式,當exp1為true的時候後面exp2被或略,如果false的話,後面的表達式的結果會被計算出來並作為AssertionError得構造器參數。看下面的例子:
public class AssertTest
{
public static void main(String[] args)
{
AssertTest at = new AssertTest();
at.assertMe(true);
at.assertMe(false);
}
private void assertMe(boolean boo)
{
String s = null;
assert boo?true:false:s = “hello world”;
System.out.println(“true condition”);
}
}運行的時候會得到這樣的結果
true condition
Exception in thread “main” java.lang.AssertionError: hello world
at AssertTest.assertMe(AssertTest.java:14)
at AssertTest.main(AssertTest.java:7)
Assert最好不要濫用,原因是assert並不一定都是enable的,下面兩種情況就不應該用assert
不要再public的方法裡面檢查參數是不是為null之類的操作
例如public int get(String s)
{
assert s != null;
}
如果需要檢查也最好通過if s = null 拋出NullPointerException來檢查
不要用assert來檢查方法操作的返回值來判斷方法操作的結果
例如 assert list.removeAll();這樣看起來好像沒有問題 但是想想如果assert 被disable呢,那樣他就不會被執行了 所以removeAll()操作就沒有被執行 可以這樣代替
boolean boo = list.removeAl();
assert boo;
就說這麼多吧,assert是scjp1.4的考試內容 所以還是有必要了解的
高級Java斷言的用途?
斷言是在Java1.4中引入的。它能讓驗證假設。如果斷言失敗(即返回false),就會拋出AssertionError(如果啟用斷言)。
Java中斷言的用法
第一步:定義一個斷言,如:
int number=-28; assert (number0):”負數不能計算平方根”;//此斷言是假的,所以會輸出後面內容,之後會報錯
第二步:在斷言的類中右擊選擇“Run As”,之後選擇” Run Configuration“;
第三步:選擇 Arguments 選項卡;
第四步:在 VM arguments 文本框中輸入” -ea“來運行斷言;
輸出結果:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192993.html