1. 程式人生 > >java中的新增的assert斷言方法

java中的新增的assert斷言方法

java語言在發展的時候,對於除錯員來說,除錯工作是很累人的,但是java裡的發展卻在一定程度上方便了他們,現在就有一個斷言的功能,就是說,可以使用assert關鍵字來判斷一個boolean的屬性,到底是true還是false,不過一些程式設計用的軟體eclipse和myeclipse預設情況下並沒有開啟這個功能,

Eclipse中如何開啟斷言(Assert),方法有二:1.Run -> Run Configurations -> Arguments頁籤 -> VM arguments文字框中加上斷言開啟的標誌:-enableassertions 或者-ea 就可以了,就是在這裡的方框裡邊直接輸入就可以了,當然你也可以輸入-da,這個是用來 關閉 這個功能的,當然一般情況下,我們都會把這裡邊的都開著,另外槓槓的-ea命令是開啟使用者定義的包,但是如果需要開啟系統定義的包,還是需要輸入-esa  在輸入完-ea之後換行,然後再輸入-esa,記住,這裡沒有任何的空格!!!輸入完之後就點選run確認了就可以了。
2.在myEclipse中,Windows -> Preferences ->Java ->Installed JREs ->點選正使用的JDK ->Edit ->Default VM Arguments文字框中輸入:-ea(本人採用了此方法,這個也只是一樣的)
現在我們可以來測試下到底是不是成功了的,我們就在main函式裡邊呼叫下我給大家寫的這個函式 public static String isAssertionOk(){
boolean ok=false;
assert ok=true;
return ok?"恭喜你,Assert功能已經開啟成功":"抱歉,Assert功能還沒有開啟成功,"
+ "請重新檢視上邊的方法,謝謝";
}

</pre>執行結果是什麼?<p></p><pre code_snippet_id="1973934" snippet_file_name="blog_20161108_3_5077345" name="code" class="plain">程式錯誤
-------------
程式正常
-------------
it is true!
null
s=null
檢查字串null是不是空串     true  s=null
檢查字串null是不是空串     true
看完了這個,我想你應該有很多的感觸吧!

這個功能可以判斷一個boolean型別是不是true,如果是,那麼對應於assert boolean :"程式錯誤";這樣的語句,如果boolean是真的,那麼冒號後邊的就不會讀取。如果是假的,那麼冒號後邊的就會被讀取為錯誤資訊,也就是會丟擲一個錯誤,這個錯誤的型別是AssertionError,所以在這裡就需要一個try...catch語句,

assert expression1;
assert expression1:expression2;
如果expression1為true,則不丟擲錯誤,程式正常執行,expression2也不會執行。
如果expression1為false,則丟擲異常,程式中斷跳出,expression2執行。

一般來說,不要在expression1、expression2中使用函式的返回值;
不要將其使用在public函式中檢查輸入引數,但可以用於private函式中檢測輸入引數。

使用時,編譯時需要用javac -source;執行時需要使用Java -ea。


個人的一點理解:使用assert只是為了幫助我們除錯程式,因此使用assert所遵循的原則就是“不能因為有了assert的存在而使程式的結構發生任何的改變”,說白了就是“如果把assert部分刪除了,程式依然不會有任何的問題,只不過不能幫助我們檢查出一些錯誤來了”,因此使用assert的時候不應該在表示式中使用函式,因為一旦把這句assert語句刪除後,程式的結構就改變了,這不符合上述提到的原則!

   在本節,我們將考慮assertion與繼承的關係,研究assert是如何定位的。如果開啟一個子類的assertion,那麼它的父類的assertion是否執行?

 下面的例子將顯示如果一個assert語句在父類,而當它的子類呼叫它時,該assert為false。我們看看在不同的情況下,該assertion是否被處理。

class Base {
	public void baseMethod() {
		try {
			assert false:"Assertion failed:This is base";// 總是assertion失敗
		} catch (Throwable e) {
			// TODO: handle exception
			Cout.addLine(e.getMessage());
		}
		System.out.println("Base Method");
	}
}
	
class Exercise extends Base {
	public void derivedMethod() {
		try {
			assert false : "Assertion failed:This is derive";// 總是assertion失敗
		} catch (AssertionError e) {
			// TODO: handle exception
			Cout.addLine(e.getMessage());
		}
		System.out.println("Derived Method");
	}
	public static void  f() {
		try {
			assert false : "111";
		} catch (AssertionError e) {
			// TODO: handle exception
			Cout.addLine(e.getMessage());
		}
	}
	public static void main(String[] args) {
		Exercise derived=new Exercise();

			derived.baseMethod();
			derived.derivedMethod();
		
		
	}
}
執行結果是:
Assertion failed:This is base
Base Method
Assertion failed:This is derive
Derived Method
現在應該懂了吧!!!

如果還是有疑問的,可以加我qq   2553627958