Java 之 assert (斷言)



我們知道C/C++語言中有斷言的功能(assert)。在Java SE 1.4版本以后也增加了斷言的特性。

斷言是為了方便調試程序,並不是發布程序的組成部分。理解這一點是很關鍵的。

默認情況下,JVM是關閉斷言的。因此如果想使用斷言調試程序,需要手動打開斷言功能。在命令行模式下運行Java程序時可增加參數-enableassertions或者-ea打開斷言。可通過-disableassertions或者-da關閉斷言(默認情況,可有可無)。

斷言的使用:

斷言是通過關鍵字assert來定義的,一般的,它有兩種形式。

1. assert <bool expression>;       比如     boolean isStudent = false; assert isStudent;

2. assert <bool expression> : <message>;    比如  boolean isSafe = false;  assert isSafe : "Not Safe at all";

光說無用,舉幾個簡單的例子:


第一種形式:


   
   
  
  
          
  1. public class AssertionTest {
  2. public static void main(String[] args) {
  3. boolean isSafe = false;
  4. assert isSafe;
  5. System.out.println( "斷言通過!");
  6. }
  7. }


如果是在命令行模式下運行,需要指明開啟斷言功能。如

java -ea AssertionTest
  
  
 
 
         

如果是在IDE下,比如Eclipse,可這樣設置: Run as -> Run Configurations -> Arguments -> VM arguments:敲入-ea即可。



輸出結果:

Exception in thread "main" java.lang.AssertionError
	at AssertionTest.main(AssertionTest.java:8)


第二種形式:


   
   
  
  
          
  1. public class AssertionTest {
  2. public static void main(String[] args) {
  3. boolean isSafe = false;
  4. assert isSafe : "Not safe at all";
  5. System.out.println( "斷言通過!");
  6. }
  7. }

輸出結果:

Exception in thread "main" java.lang.AssertionError: Not safe at all
	at AssertionTest.main(AssertionTest.java:7)

第二種形式和第一種的區別在於后者可以指定錯誤信息。


陷阱:

斷言只是為了用來調試程序,切勿將斷言寫入業務邏輯中。比如考慮下面這個簡單的例子:


   
   
  
  
          
  1. public class AssertionTest {
  2. public static void main(String[] args) {
  3. assert ( args.length > 0);
  4. System.out.println(args[ 1]);
  5. }
  6. }

該句assert (args.length >0)和if(args.length >0)意思相近,但是如果在發布程序的時候(一般都不會開啟斷言),所以該句會被忽視,因此會導致以下

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at AssertionTest.main(AssertionTest.java:7)

更好的替代品:

JUnit。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM