亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2SE1.4中assertion功能介紹

2019-11-18 11:38:06
字體:
來源:轉載
供稿:網友

   作者: 甲子
  
  摘要
  
    J2SE 1.4 在java中新增添了assertion(暫譯作斷定)功能。 最簡單的情形下,在JAVA代碼中任一行可以寫入一條布爾表達式, 在這一行代碼的最前面加上assert要害字,就可以實現這樣的功能: 假如表達式為真,則代碼繼續執行;否則,拋出異常。為了實現這項功能, 在JAVA中新添加了assert要害字,AssertionError類, java.lang.ClassLoader中增加了幾個新的方法。 本文章具體介紹了assert要害字的使用, 從命令行控制assertion功能,從代碼內部控制assertion功能,以及何時使用assertion功能等內容。下文中提到assert時特指assert要害字,而提到assertion則表示斷定語句或斷定功能。
  
  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 );
    }
   }
  }
  
  Base類和Derived

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
宅男66日本亚洲欧美视频| 亚洲理论片在线观看| 中文字幕亚洲综合久久筱田步美| 4438全国成人免费| 欧美极品在线播放| 久久人人爽人人爽人人片av高请| 91av视频在线播放| 亚洲精品mp4| 欧美日韩在线观看视频| 欧美视频精品一区| 欧美视频中文在线看| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧美另类中文字幕| 中文字幕av一区二区| 国产91色在线免费| 91精品国产91久久久久久久久| 日韩av大片免费看| 欧美在线日韩在线| 久久久av网站| 亚洲一区精品电影| 日本高清视频精品| 国产精品福利在线| 国产精品www色诱视频| 欧美激情在线观看| 亚洲韩国欧洲国产日产av| 一区二区在线视频播放| 中文字幕亚洲欧美日韩在线不卡| 国产精品视频中文字幕91| 成人在线中文字幕| 69av成年福利视频| 欧美性资源免费| 久久影视三级福利片| 欧美性受xxxx黑人猛交| 国内精品久久久久久久久| 国产精品欧美日韩久久| 91伊人影院在线播放| 日韩视频精品在线| 亚洲精品日韩欧美| 欧美多人乱p欧美4p久久| 国内精品400部情侣激情| 亚洲成在人线av| 久久久91精品| 欧美www在线| 中文字幕在线观看亚洲| 俺去啦;欧美日韩| 亚洲国产日韩欧美在线动漫| 久久久精品一区| 精品无人区太爽高潮在线播放| 中文字幕日韩免费视频| 日韩一区视频在线| 国产精品欧美一区二区三区奶水| 国产精品网红福利| 国产成人精品免费视频| 久久国产精品久久精品| 人人做人人澡人人爽欧美| 欧美激情性做爰免费视频| 国产69精品久久久久久| 亲子乱一区二区三区电影| 亚洲欧洲激情在线| 亚洲男人的天堂在线| 日韩欧美在线视频| 久久免费在线观看| 亚洲永久免费观看| 精品久久久久久电影| 久久久中精品2020中文| 国产日韩av在线播放| 久久精品中文字幕电影| 欧美国产日韩xxxxx| 日韩成人性视频| 久久好看免费视频| 欧美激情高清视频| 国产精品久久二区| 亚洲精品国产精品国自产在线| 欧美美女操人视频| 国产精品久久网| 亚洲综合国产精品| 色偷偷偷综合中文字幕;dd| 91精品国产91久久久久| 久久久久久九九九| 亚洲视频在线观看视频| 4438全国成人免费| 亚洲va欧美va国产综合久久| 日韩国产精品一区| 一区二区三区精品99久久| 日韩中文字幕在线视频| 欧美最猛黑人xxxx黑人猛叫黄| 欧美性高潮床叫视频| 亚洲欧美精品中文字幕在线| 欧美中文字幕视频在线观看| 91日韩在线播放| 欧美激情久久久| 亚洲一区av在线播放| 伊人久久久久久久久久| 日韩欧美在线播放| 日韩电视剧在线观看免费网站| 97人人模人人爽人人喊中文字| 欧美日韩裸体免费视频| 91国偷自产一区二区三区的观看方式| 日韩av网址在线| 在线国产精品视频| 亚洲一区999| 日韩视频免费大全中文字幕| 91午夜在线播放| 成人免费直播live| 日韩欧美国产激情| 久久久免费在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲国产精品99| 欧美成人黑人xx视频免费观看| 国产成人鲁鲁免费视频a| 国产精品久久久久久超碰| 91免费高清视频| 欧美日韩第一视频| 中国日韩欧美久久久久久久久| 国产精品免费小视频| 亚洲精品一区二三区不卡| 日本国产欧美一区二区三区| 久久免费成人精品视频| 91国偷自产一区二区三区的观看方式| 日本欧美一级片| 影音先锋日韩有码| 久久九九全国免费精品观看| 中文日韩在线视频| 日本不卡视频在线播放| 日本道色综合久久影院| 91精品国产高清自在线| 久久精品色欧美aⅴ一区二区| 国模精品一区二区三区色天香| 欧美激情成人在线视频| 亚洲福利视频专区| 国产91热爆ts人妖在线| 欧美成年人视频网站欧美| 国产性猛交xxxx免费看久久| 97久久久久久| 国产精品影片在线观看| 亚洲va久久久噜噜噜久久天堂| 精品久久久国产精品999| 91久久精品国产91久久| 亲子乱一区二区三区电影| 26uuu亚洲国产精品| 欧美日韩精品中文字幕| 91精品国产沙发| 日韩在线播放一区| 国产精品草莓在线免费观看| 亚洲电影免费在线观看| 一本色道久久综合狠狠躁篇的优点| 国产精品视频一区国模私拍| 久久久久久久久亚洲| 欧美精品www在线观看| 久久99热精品| 高清欧美性猛交xxxx| 色综合五月天导航| 按摩亚洲人久久| 国产精品亚洲综合天堂夜夜| 日韩在线免费视频观看| 日韩av成人在线观看| 97视频在线观看免费| 亚洲成人网在线| zzijzzij亚洲日本成熟少妇| 97久久超碰福利国产精品…| 亚洲精品国精品久久99热一| 国产成人久久精品| 亚洲黄色成人网| 日韩av观看网址|