Java中assert關鍵字的實現 – JAVA編程語言程序開發技術文章

J2SE 1.4在語言上提供瞭一個新特性,就是assertion(斷言)功能,它是該版本在Java語言方面最大的革新。在軟件開發中,assertion是一種經典的調試、測試方式。

       assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制,如C,C++和Eiffel等,但是支持的形式不盡相同,有的是通過語言本身、有的是通過庫函數等。另外,從理論上來說,通過assertion方式可以證明程序的正確性,但是這是一項相當復雜的工作,目前還沒有太多的實踐意義。

  在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為瞭提高性能,在軟件發佈後,assertion檢查通常是關閉的。下面簡單介紹一下Java中assertion的實現。

  1.1) 語法表示

  在語法上,為瞭支持assertion,Java增加瞭一個關鍵字assert。它包括兩種表達式,分別如下:

  assert expression1;

  assert expression1: expression2;

  在兩種表達式中,expression1表示一個boolean表達式,expression2表示一個基本類型或者是一個對象(Object) ,基本類型包括boolean,char,double,float,int和long。由於所有類都為Object的子類,因此這個參數可以用於所有對象。

  1、assert

  如果為true,則程序繼續執行。

  如果為false,則程序拋出AssertionError,並終止執行。

  2、assert : <錯誤信息表達式>

  如果為true,則程序繼續執行。

  如果為false,則程序拋出java.lang.AssertionError,並輸出<錯誤信息表達式>。

  1.2) 語義含義

  在運行時,如果關閉瞭assertion功能,這些語句將不起任何作用。如果打開瞭assertion功能,那麼expression1的值將被計算,如果它的值為false,該語句強拋出一個AssertionError對象。如果assertion語句包括expression2參數,程序將計算出expression2的結果,然後將這個結果作為AssertionError的構造函數的參數,來創建AssertionError對象,並拋出該對象;如果expression1值為true,expression2將不被計算。

  一種特殊情況是,如果在計算表達式時,表達式本身拋出Exception,那麼assert將停止運行,而拋出這個Exception。

  1.3) 一些assertion例子

  下面是一些Assert的例子。

  assert  0 < value;

  assert  0 < value:"value="+value;

  assert  ref != null:"ref doesn''t equal null";

  assert  isBalanced();

  1.4) 編譯

  由於assert是一個新關鍵字,使用老版本的JDK是無法編譯帶有assert的源程序。因此,我們必須使用JDK1.4(或者更新)的Java編譯器,在使用Javac命令時,我們必須加上-source 1.4作為參數。-source 1.4表示使用JDK 1.4版本的方式來編譯源代碼,否則編譯就不能通過,因為缺省的Javac編譯器使用JDK1.3的語法規則。

  一個簡單的例子如下:

  javac -source 1.4 test.java

  1.5) 運行

  由於帶有assert語句的程序運行時,使用瞭新的ClassLoader和Class類,因此,這種程序必須在JDK1.4(或者更高版本)的JRE下運行,而不能在老版本的JRE下運行。

  由於我們可以選擇開啟assertion功能,或者不開啟,另外我們還可以開啟一部分類或包的assertion功能,所以運行選項變得有些復雜。通過這些選項,我們可以過濾所有我們不關心的類,隻選擇我們關心的類或包來觀察。下面介紹兩類參數:

  參數 -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

      1.6)說明

       assertion為開發人員提供瞭一種靈活地調試和測試機制,它的使用也非常簡單、方便。

      1.7) MyEclipse中用法

       測試代碼:
    
    設置執行參數:
   
    即可。 
  

摘自  ccgkren
 

發佈留言