Java中assert關鍵字的實現
J2SE 1.4在語言上提供了一個新特性,就是assertion(斷言)功能,它是該版本在Java語言方面最大的革新。在軟體開發中,assertion是一種經典的除錯、測試方式。
assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制,如C,C++和Eiffel等,但是支援的形式不盡相同,有的是通過語言本身、有的是通過庫函式等。另外,從理論上來說,通過assertion方式可以證明程式的正確性,但是這是一項相當複雜的工作,目前還沒有太多的實踐意義。
在實現中,assertion就是在程式中的一條語句,它對一個boolean表示式進行檢查,一個正確程式必須保證這個boolean表示式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,
1.1) 語法表示
在語法上,為了支援assertion,Java增加了一個關鍵字assert。它包括兩種表示式,分別如下:
assert expression1;
assert expression1: expression2;
在兩種表示式中,expression1表示一個boolean表示式,expression2表示一個基本型別或者是一個物件(Object) ,基本型別包括boolean,char,double,float,int和long。由於所有類都為Object的子類,因此這個引數可以用於所有物件。
1、assert
如果為true,則程式繼續執行。
如果為false,則程式丟擲AssertionError,並終止執行。
2、assert : <錯誤資訊表示式>
如果為true,則程式繼續執行。
如果為false,則程式丟擲java.lang.AssertionError,並輸出<錯誤資訊表示式>。
1.2) 語義含義
在執行時,如果關閉了assertion功能,這些語句將不起任何作用。如果打開了assertion功能,那麼expression1的值將被計算,如果它的值為false,該語句強丟擲一個AssertionError物件。如果assertion語句包括expression2引數,程式將計算出expression2的結果,然後將這個結果作為AssertionError的建構函式的引數,來建立AssertionError物件,並丟擲該物件;如果expression1值為true,expression2將不被計算。
一種特殊情況是,如果在計算表示式時,表示式本身丟擲Exception,那麼assert將停止執行,而丟擲這個Exception。
1.3) 一些assertion例子
下面是一些Assert的例子。
assert 0 < value;
assert 0 < value:"value="+value;
assert ref != null:"ref doesn''t equal null";
assert isBalanced();
1.4) 編譯
由於assert是一個新關鍵字,使用老版本的JDK是無法編譯帶有assert的源程式。因此,我們必須使用JDK1.4(或者更新)的Java編譯器,在使用Javac命令時,我們必須加上-source 1.4作為引數。-source 1.4表示使用JDK 1.4版本的方式來編譯原始碼,否則編譯就不能通過,因為預設的Javac編譯器使用JDK1.3的語法規則。
一個簡單的例子如下:
javac -source 1.4 test.java
1.5) 執行
由於帶有assert語句的程式執行時,使用了新的ClassLoader和Class類,因此,這種程式必須在JDK1.4(或者更高版本)的JRE下執行,而不能在老版本的JRE下執行。
由於我們可以選擇開啟assertion功能,或者不開啟,另外我們還可以開啟一部分類或包的assertion功能,所以執行選項變得有些複雜。通過這些選項,我們可以過濾所有我們不關心的類,只選擇我們關心的類或包來觀察。下面介紹兩類引數:
引數 -esa和 -dsa:
它們含義為開啟(關閉)系統類的assertion功能。由於新版本的Java的系統類中,也使了assertion語句,因此如果使用者需要觀察它們的執行情況,就需要開啟系統類的assertion功能 ,我們可使用-esa引數開啟,使用 -dsa引數關閉。 -esa和-dsa的全名為-enablesystemassertions和-disenablesystemassertions,全名和縮寫名有同樣的功能。
引數 -ea和 -ea:
它們含義為開啟(關閉)使用者類的assertion功能:通過這個引數,使用者可以開啟某些類或包的assertion功能,同樣使用者也可以關閉某些類和包的assertion功能。開啟assertion功能引數為-ea;如果不帶任何引數,表示開啟所有使用者類;如果帶有包名稱或者類名稱,表示開啟這些類或包;如果包名稱後面跟有三個點,代表這個包及其子包;如果只有三個點,代表無名包。關閉assertion功能引數為-da,使用方法與-ea類似。
-ea和-da的全名為-enableassertions和-disenableassertions,全名和縮寫名有同樣的功能。
下面表格表示了引數及其含義,並有例子說明如何使用。
引數 例子 說明
-ea java -ea 開啟所有使用者類的assertion
-da java -da 關閉所有使用者類的assertion
-ea: java -ea:MyClass1 開啟MyClass1的assertion
-da: java -da: MyClass1 關閉MyClass1的assertion
-ea: java -ea:pkg1 開啟pkg1包的assertion
-da: java -da:pkg1 關閉pkg1包的assertion
-ea:... java -ea:... 開啟預設包(無名包)的assertion
-da:... java -da:... 關閉預設包(無名包)的assertion
-ea:... java -ea:pkg1... 開啟pkg1包和其子包的assertion
-da:... java -da:pkg1... 關閉pkg1包和其子包的assertion
-esa java -esa 開啟系統類的assertion
-dsa java -dsa 關閉系統類的assertion
1.6)說明
assertion為開發人員提供了一種靈活地除錯和測試機制,它的使用也非常簡單、方便。
1.7) MyEclipse中用法
測試程式碼:
設定執行引數:
即可。
相關推薦
Java中assert關鍵字的實現
J2SE 1.4在語言上提供了一個新特性,就是assertion(斷言)功能,它是該版本在Java語言方面最大的革新。在軟體開發中,assertion是一種經典的除錯、測試方式。 assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都
就是要你懂Java中volatile關鍵字實現原理
stub string home 技術分享 訪問速度 get 地址傳遞 code 緩沖 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之
Java中volatile關鍵字實現原理
三級 poll 解讀 內存屏障 就會 主存 發生 調用 獲得 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之間的可見性,它是ja
java中assert關鍵字
Java2在1.4中新增了一個關鍵字:assert。在程式開發過程中使用它建立一個斷言(assertion)。,它的語法形式有如下所示的兩種形式:1、assert condition; 這裡condition是一個必須為真(true)的表示式。如果表示式的結果為tru
JAVA中this關鍵字的用法
blog http tro font return his 局部變量 .com str this關鍵字主要有三個應用: 1.調用本類中的屬性,也就是類的成員變量; 2.調用本類中的其他方法; 3.調用本類中的其他構造方法,調用時候要放在構造方法的首行。 * this關鍵
java中volatile關鍵字的含義
能夠 system 內存區域 退出 tro 技術 2.4 虛擬機 們的 在java線程並發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多線程並發處理的時候就可以萬事大吉。 Java語言是支持多線程的,為了解決線程並發的問題,在語
Java中static關鍵字用法總結
副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta
Java中instanceof關鍵字的用法總結
animal copy false 運算 erl 一個 strong 以及 繼承 instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,
[轉] java中volatile關鍵字的含義
讀取 add 由於 tar 並不是 ges 內部 post 計數 在java線程並發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多線程並發處理的時候就可以萬事大吉。 Java語言是支持多線程的,為了解決線程並發的問題,在
Java中ConcurrentHashMap的實現
concurrent hashmap Java中ConcurrentHashMap的實現 ConcurrentHashMap(簡寫CHM)引入了分割,並提供了HashTable支持的所有的功能。在CHM中,支持多線程對Map做讀操作,並且不需要任何的blocking。這得益於CHM將Map分
Java中HashMap底層實現原理(JDK1.8)源碼分析
blank imp dash logs || 屬性 lte das ces 這幾天學習了HashMap的底層實現,但是發現好幾個版本的,代碼不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一樣,原來他們沒有指定JDK版本,很多文章都是舊版本J
Java中synchronized關鍵字理解
監視器 pre 定義 exc 執行 zed 三種 gen 好記性不如爛筆頭 好記性不如爛筆頭~~ 並發編程中synchronized關鍵字的地位很重要,很多人都稱它為重量級鎖。利用synchronized實現同步的基礎:Java中每一個對象都可以作為鎖。具體表現為以下三種形
Java中instanceof關鍵字的用法
m60 cin .com 關鍵字 adr www. zdb kms http f72o1u前盞彜渦踴促http://shequ.docin.com/mym827424fzhy9晨撈晨詡鷗淹http://www.docin.com/rww41025xh82bc僭攀潭倜歡稱ht
隨筆② Java中的關鍵字 --- final關鍵字
初始 編譯 this 集合 div 緩存 nal ext 環境 一:final關鍵字 ① final變量:凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為final的都叫作final變量。final變量經常和static關鍵字一起使用,作為常量。
隨筆14 java中的關鍵字
this div .cn ges -1 style class clas ron 一:java中的關鍵字列表 二:super關鍵字 super關鍵字在子類內部使用,代表父類對象。 訪問父類的屬性 super.屬性名 訪問父類的方法 super.方法名() 子類構
Java中使用UDP實現簡單的聊天功能
udp http @override 簡單的 ima string [] 發送消息 sock 通過DatagramSocket類來實現。此類表示用來發送和接收數據報包的套接字。 發送端代碼如下: 2 3 import java.io.IOException; 4
Java中this關鍵字的使用
成員變量 用法 表示 當前 重載 說明 可讀性 舉例 調用構造 說明:this用於指向調用該方法的當前對象。 用法: 1. this.成員變量 ------ 表示訪問當前對象的成員變量 2. this() ------
java中final關鍵字
成員變量 子類 void color 需要 sta new 根據 基本用法 在Java中,final關鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量)。下面就從這三個方面來了解一下final關鍵字的基本用法。 1.修飾類 當用final修飾一個類時,表明這個類
Java中的關鍵字 transient
puts amp 存儲 style object code pin map 這一 在討論transient之前,有必要先搞清楚Java中序列化的含義; Java中對象的序列化指的是將對象轉換成以字節序列的形式來表示,這些字節序列包含了對象的數據和信息,一個序列化後的對象可以
Java 中的關鍵字和保留字
width interface continue rac borde ctf got break order 關鍵字: Java 語言中已經事先定義好了的,有著特殊含義和用途 訪問控制 類、方法和變量修飾符 程序控制 異常處理 包相關 基本類型 變量引用 publ