Java中的斷言assert的用法


Java陷阱之assert關鍵字

 

一、概述

 

      在C和C++語言中都有assert關鍵,表示斷言。

      在Java中,同樣也有assert關鍵字,表示斷言,用法和含義都差不多。

 

二、語法

 

       在Java中,assert關鍵字是從JAVA SE 1.4 引入的,為了避免和老版本的Java代碼中使用了assert關鍵字導致錯誤,Java在執行的時候默認是不啟動斷言檢查的(這個時候,所有的斷言語句都 將忽略!),如果要開啟斷言檢查,則需要用開關-enableassertions或-ea來開啟。

 

       assert關鍵字語法很簡單,有兩種用法:

 

       1、assert <boolean表達式>

        如果<boolean表達式>為true,則程序繼續執行。

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

 

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

        如果<boolean表達式>為true,則程序繼續執行。

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

 

三、應用實例

 

   下面給出一個例子,通過例子說明其用法:


 


   
   
  
  
          
  1. public  class AssertFoo {
  2.      public static void main(String args[]) {
  3.         //斷言1結果為true,則繼續往下執行
  4.          assert  true;
  5.         System.out.println( "斷言1沒有問題,Go!");
  6.         System.out.println( "\n-----------------\n");
  7.         //斷言2結果為false,程序終止
  8.          assert  false : "斷言失敗,此表達式的信息將會在拋出異常的時候輸出!";
  9.         System.out.println( "斷言2沒有問題,Go!");
  10.     }
  11. }

     保存代碼到C:\AssertFoo.java,然后按照下面的方式執行,查看控制台輸出結果:

 

1、編譯程序:

    C:\>javac AssertFoo.java

 

2、默認執行程序,沒有開啟-ea開關:


   
   
  
  
          
  1. C:\>java AssertFoo
  2. 斷言1沒有問題,Go!
  3. -----------------
  4. 斷言2沒有問題,Go!

3、開啟-ea開關,執行程序:


   
   
  
  
          
  1. C:\> java -ea AssertFoo
  2. 斷言1沒有問題, Go
  3. -----------------
  4. Exception in thread " main" java .lang .AssertionError: 斷言失敗,此表達式的信息將
  5. 會在拋出異常的時候輸出!
  6.         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能給你帶來多少好處,多少麻煩,這是我們選擇是否使用的的原則。


免責聲明!

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



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