<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    編程生活

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks
     I.網上關于斷言的資料

            
             J2SE 1.4 在JAVA中新增添了assertion(斷言)功能。 最簡單的情形下,在JAVA代碼中任一行可以寫入一條布爾表達式,在這一行代碼的最前面加上assert關鍵字,就可以實現這樣的功能:如果表達式為真,則代碼繼續執行;否則,拋出異常。為了實現這項功能, 在JAVA中新添加了assert關鍵字,AssertionError類, java.lang.ClassLoader中增加了幾個新的方法。 
            assertion功能提供了一種在代碼中進行正確性檢查的機制,這種檢查通常用于開發和調試階段,到了軟件完成部署后就可以關閉。這使得程序員可以在代碼中加入調試檢查語句,同時又可以在軟件部署后關閉該功能而避免對軟件速度和內存消耗的影響。基本上,assertion功能就是JAVA中的一種新的錯誤檢查機制,只不過這項功能可以根據需要關閉。
            通常在C和C++中,斷言功能語句是可以通過預處理過程而不編譯進最終的執行代碼,由于JAVA中沒有宏功能,所以在以前的java版本中斷定功能沒有被廣泛的使用,在JDK1.4中通過增加assert關鍵字改變了這種狀況。
        這項新功能最重要的特點是斷定語句可以在運行時任意的開啟或關閉,這意味著這些起錯誤檢查功能的語句不必在開發過程結束后從源代碼中刪除。

      assertion語法非常簡單,但正確的使用能幫助我們編寫出健壯(ROBAST)可靠的代碼。這篇文章中,我們不僅學習如何編寫assertion語句,更要討論應該在什么情況下使用assertion語句。

      一、assertion語法基本知識

      我們可以用新的JAVA關鍵字assert來書寫斷定語句。一條斷定語句有以下兩種合法的形式:

      assert expression1;

      assert expression1 : expression2;

      expression1是一條被判斷的布爾表達式,必須保證在程序執行過程中它的值一定是真;expression2是可選的,用于在expression1為假時,傳遞給拋出的異常AssertionError的構造器,因此expression2的類型必須是合法的AssertionError構造器的參數類型。以下是幾條斷定語句的例子:

      assert 0 < value;

      assert ref != null;

      assert count == (oldCount + 1);

      assert ref.m1(parm);

      assert關鍵字后面的表達式一定要是boolean類型,否則編譯時就會出錯。

      以下是使用斷定語句的一個完整例子(見粗體語句行):
    public class aClass {
      
    public void aMethod( int value ) {
        
    assert value >= 0;
        System.out.println( 
    "OK" );
      }

      
    public static void main( String[] args ){
         aClass foo 
    = new aClass();
         System.out.print( 
    "aClass.aMethod( 1 ): " );
         foo.aMethod(
    1); 
         System.out.print( 
    "aClass.aMethod( -1 ): " );
    foo.aMethod( 
    -1 );

      }


      }


      這段程序通過語句 assert value >= 0; 來判斷傳入aMethod方法中的參數是否不小于0,如果傳入一個負數,則會觸發AssertionError的異常。

      為了和J2SE 1.4 以前的程序兼容,在JDK1.4 中的javac 和 java 命令在默認情況下都是關閉assertion功能的,即不允許使用assert作為關鍵字,這就保證了如果你以前編寫的程序中如果使用了assert作為變量名或是方法名,程序不必修改仍然可以運行。但需要注意的是,這些程序是無法使用JDK1.4 的javac進行重新編譯的,只能使用JDK1.3或之前的版本編譯。為了編譯我們前面寫的小程序,首先要使用符合J2SE 1.4 的編譯器,同時還要使用幾個命令行參數來使編譯器啟用assertion功能。

      使用以下的命令來編譯aClass.java:

      javac -source 1.4 aClass.java

      如果我們使用java aClass 來運行這段程序,就會發現assertion語句實際上并未得到執行,和javac一樣,java命令在默認情況下,關閉了assertion功能,因而會忽略assertion語句。如何啟用assertion語句將在下一節討論。

      二、通過命令行控制assertion功能

      assertion語句的一項最重要的特點是它可以被關閉,關閉的作用是這條代碼雖然仍存在于程序當中,但程序運行時,JVM會忽略它的存在,不予執行,這樣代碼的運行速度不會由于assertion語句的存在而受到影響,如果代碼執行過程中出現了問題,我們又可以啟用assertion語句,幫助我們進行分析判斷。默認情況下,這項功能是關閉的。(提示:本小節介紹的命令行參數都是針對SUN提供的JDK1.4而言,如果使用其他公司的JDK則未必會完全一樣。)

      JDK1.4 中,通過java命令的命令行選項 -ea (-enableassertions 的縮寫)來啟用。以下兩個命令是等效的:

      java -ea myPackage.myProgram

      java -enableassertions myPackage.myProgram

      同樣,我們通過 -da (-disableassertions 的縮寫)來關閉assertion功能:

      java -da myPackage.myProgram

      java -disableassertions myPackage.myProgram

      assertion功能還可以針對特定的包(package)或類(class)分別啟用和關閉。針對類時,使用完整的類名;針對包時,包名后面緊跟“...”:

      java -ea:<class> myPackage.myProgram

      java -da:<package>... myPackage.myProgram

      在一個java命令中使用多項 -ea -da 參數時,后面的參數設定會覆蓋前面參數的設定,比如我們可以默認啟用所有的assertion功能,但針對特定的包卻關閉此功能:

      java -ea -da:<package>... myPackage.myProgram

      對于未命名的包(位于當前目錄中)都屬于默認包,可以使用以下的命令控制:

      java -ea:... myPackage.myProgram

      java -da:... myPackage.myProgram

      對于隨JVM安裝時自己附帶的所有系統類,可以分別使用 -esa(-enablesystemassertions)和-dsa(-disablesystemassertions)來控制assertion功能的啟用和關閉。在表1.1中列出了控制assertion功能參數的所有用法。

      表1 JDK1.4 中java命令和assertion功能有關的命令行參數

      命令行參數 實例 含義

      -ea Java -ea 啟用除系統類外所有類的assertion

      -da

      Java -da 關閉除系統類外所有類的assertion

      -ea:<classname>

      Java -ea:AssertionClass 啟用AssertionClass類的assertion

      -da:<classname>

      Java -da:AssertionClass 關閉AssertionClass類的assertion

      -ea:<packagename> Java -ea:pkg0... 啟用pkg0包的assertion

      -da:<packagename> Java -da:pkg0... 關閉pkg0包的assertion

      -esa

      Java -esa 啟用系統類中的assertion

      -dsa

      Java -dsa 關閉系統類中的assertion

      至此,我們前面編寫的小程序aClass可以用以下的任意命令運行:

      java -ea aClass

      java -ea:aClass aClass

      java -ea:... aClass

      運行結果如下:

      aClass.aMethod( 1 ): OK

      aClass.aMethod( -1 ): java.lang.AssertionError

      at aClass.aMethod(aClass.java:3)

      at aClass.main(aClass.java:12)

      Exception in thread "main"

      三、assertion命令行參數之間的繼承關系

      assertion功能的啟用和關閉可以一直控制到每一個類,一個命令行可以容納任意多個-ea -da 參數,這些參數之間是如何相互起作用的,基本上遵循兩個原則:特定具體的設定優先于一般的設定,后面的?設定優先于前面的設定。我們看下面的例子:

      // Base.java

      
    package tmp;

      
    public class Base{

      
    public void m1( boolean test ){

      
    assert test : "Assertion failed: test is " + test;

      System.out.println( 
    "OK" );

      }


      }


      
    // Derived.java

      
    //

      
    package tmp.sub;

      
    import tmp.Base;

      
    public class Derived extends Base{

      
    public void m2( boolean test ){

      
    assert test : "Assertion failed: test is " + test;

      System.out.println( 
    "OK" );

      }


      
    public static void printAssertionError( AssertionError ae ){

      StackTraceElement[] stackTraceElements 
    = ae.getStackTrace();

      StackTraceElement stackTraceElement 
    = stackTraceElements[ 0 ];

      System.err.println( 
    "AssertionError" );

      System.err.println( 
    " class= " + stackTraceElement.getClassName() );

      System.err.println( 
    " method= " + stackTraceElement.getMethodName() );

      System.err.println( 
    " message= " + ae.getMessage() );

      }


      
    public static void main( String[] args ){

      
    try{

      Derived derived 
    = new Derived();

      System.out.print( 
    "derived.m1( false ): " );

      derived.m1( 
    false );

      System.out.print( 
    "derived.m2( false ): " );

      derived.m2( 
    false );

      }
    catch( AssertionError ae ){

      printAssertionError( ae );

      }


      }


      }

    II.eclipse中最簡單使用assert的配置

    這樣你就可以在開發期間使用assert了
    posted on 2007-10-23 10:30 wilesun 閱讀(3774) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲乱码无码永久不卡在线| 亚洲AV无码不卡在线观看下载| 亚洲欧美日韩国产成人| 午夜影院免费观看| 亚洲一区二区三区国产精品| 国产成人亚洲精品91专区高清| 国产精品免费一区二区三区| 日本免费一区尤物| WWW国产亚洲精品久久麻豆| 成年人免费观看视频网站| 一本色道久久综合亚洲精品蜜桃冫| 337P日本欧洲亚洲大胆艺术图 | 日韩一区二区在线免费观看| 亚洲不卡影院午夜在线观看| 曰皮全部过程视频免费国产30分钟| 亚洲精品成a人在线观看| 一级做a爰片久久毛片免费看| 中文字幕免费视频| 亚洲午夜精品国产电影在线观看| 日日狠狠久久偷偷色综合免费| 久9热免费精品视频在线观看| 国产高清免费在线| 色欲aⅴ亚洲情无码AV| 国产亚洲精品影视在线产品 | 亚洲国产欧美一区二区三区| 国产无遮挡吃胸膜奶免费看视频| 亚洲AV一宅男色影视| 最近2019中文字幕免费直播| 亚洲综合中文字幕无线码| 又爽又黄无遮挡高清免费视频| 亚洲成AV人片久久| 免费在线不卡视频| 无码国产精品一区二区免费16| 国产亚洲精品免费| 在线成人精品国产区免费| 亚洲综合久久一本伊伊区| 亚洲国产中文字幕在线观看 | 深夜福利在线视频免费| 亚洲高清国产AV拍精品青青草原| 春暖花开亚洲性无区一区二区| 免费在线看v网址|