11.9  断言——assert



断言语句 assert 在 JDK1.4 中首次提供,专门用来进行代码测试和纠错,以提高程序的可靠性。它可以被应用在程序中的任何位置,也被称为运行断点。编程人员在 assert 语句中提供测试数据的范围或者条件,作为断言或者声明( assertion )。例如,年龄必须大于 18 岁,提供的断言则是:



 



age > 18



 



如果断言为真,即代码中变量 age 的值大于 18 ,程序将正常运行;而断言为假时,这个断言异常将被 JVM 抛出,程序将停止运行,并且打印这个异常信息。



断言语句是一种特殊语句,因为它在运行时可以被设置为开启或者关闭。断言关闭是许多 IDE 系统预设的状态,在运行时, JVM 将忽略代码中所有断言语句,所以程序可以更加有效地运行。而需要执行断言时,可设置断言开启选项。在操作系统中利用 Java 指令运行程序时,必须输入开启断言选项。



如下小节将讨论断言语句的编写、断言状态设置,以及它的应用。



11.9.1  断言编写



断言语句的语法格式如下:



 



assert booleanExpression [: message];



 



assert —— Java 关键字。



booleanExpression ——布尔代数表达式,为声明的断言。



[:message] ——可选项。需要打印的字符串异常信息。



注意,断言语句以分号结束。



为了代码可读性,布尔代数表达式一般用括号括起。下面讨论几个具体例子:



例 1 .



 



// 完整程序存在本书配套资源目录 Ch11 中名为 AssertTest.java



int age = 17;



assert (age > 18) : "Age must be greater than 18";



 



这个例子中的断言语句声明变量 age 必须大于 18 ,否则将抛出断言异常。这段代码运行后,程序将停止运行,并打印如下信息:



 



Exception in thread "main" java.lang.AssertionError: Age must be greater than



18.



at AssertTest.main(AssertTest.java:11)



 



如果 age 的值大于 18 ,符合断言,程序将继续正常运行。



例 2 .



 


// 
   完整程序存在本书配套资源目录 
   Ch11 
   中名为 
   AssertTest.java
 
  
double total = 219.98;
 
  
assert (total > 0 .0 && total < 200.0) : "total: " + total + " – out of the 
 
  
rang 
   e 
   .";


       这段代码运行后,程序将停止运行,并将打印如下信息:



 



Exception in thread "main" java.lang.AssertionError: total: 219.98 – out of 
 
  
the range.
 
  
at AssertTest.main(AssertTest.java:10)


然而,如果 total 的值在声明的断言范围之内,程序将继续正常运行。



       如果我们利用 if 语句模拟断言语句的执行功能,上面的例子可以编写如下:



 



// 完整程序存在本书配套资源目录 Ch11 中名为 AssertTest.java

double total = 219.98;
 
  
if (total <= 0.0 || total >= 200.0)  {  // 
   超出合法值范围
 
  
    System.out.println("total: " + total + " – out of the rang 
   e. 
   ");
 
  
    System.out.println("at AssertTest.main(AssertTest.java:10) ");
 
  
    System.exit(0);
 
  
}



 



这段代码运行后,程序将停止运行,并将打印如下信息:



 



total: 219.98 – out of the range.



at AssertTest.main(AssertTest.java:10)



11.9.2  开启和关闭断言



       在编译时必须设置断言语句为开启状态,即设立编译选项 -ea ,断言语句才参与运行。 ea 即 enable assertion ,可分如下几种设置情况:



l  在操作系统中利用 java 对已经编译的程序运行时,加入断言开启选项 -ea 。如:



       java —— ea ClassName



       如果使用:



 



java ClassName.



 



       再次对该程序运行时,断言语句将关闭, JVM 将忽略程序中的所有断言语句。



 



更多信息   也可以利用 java –da ClassName 关闭断言语句并运行这个程序。 da 即 disable assertion 。



 



l  在 Eclipse 中设置断言语句状态。其步骤如下:


Run 
   菜单
 
  
 
   
 
 
  
Run...
 
  
Arguments
 
  
 
   
 
 
  
        
   在 
   VM Arguments 
   窗口中,输入:
 
  
 
   
 
 
  
-ea 
   ,或者 
   -enableassertions
 
  
Apply
 
  
Run



       如果需要关闭断言设置时,进入 VM Arguments 窗口,删除输入的设置即可。



l  在 TextPad 中设置断言语句状态。其步骤如下:


Configure 
   菜单
 
  
Preference
 
  
Tools
 
  
Run Java Application
 
  
 
   
 
 
  
        
   在 
   Parameters 
   的窗口条中的开始输入:
 
  
 
   
 
 
  
-ea ( 
   注意 
   , 
   在 
   -ea 
   后必须留有一个空格 
   )

确定