日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java assertion 介绍和用法

發布時間:2025/3/21 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java assertion 介绍和用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、assertion的語法和語義

J2SE 1.4在語言上提供了一個新特性,就是assertion(斷言)功能,它是該版本在Java語言方面最大的革新。在軟件開發中,assertion是一種經典的調試、測試方式,本文將深入解析assertion功能的使用以及其設計理念,并給出相關的例子 。

assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制,如C,C++和Eiffel等,但是支持的形式不盡相同,有的是通過語言本身、有的是通過庫函數等。另外,從理論上來說,通過assertion方式可以證明程序的正確性,但是這是一項相當復雜的工作,目前還沒有太多的實踐意義。

在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處于不正確的狀態下,系統將給出警告或退出。一般來說,assertion用于保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,在軟件發布后,assertion檢查通常是關閉的。下面簡單介紹一下Java中assertion的實現。

1.1) 語法表示

在語法上,為了支持assertion,Java增加了一個關鍵字assert。它包括兩種表達式,分別如下:

assert expression1;

assert expression1: expression2;

在兩種表達式中,expression1表示一個boolean表達式,expression2表示一個基本類型或者是一個對象(Object) ,基本類型包括boolean,char,double,float,int和long。由于所有類都為Object的子類,因此這個參數可以用于所有對象。

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的全名為-enable system assertions和-disenable system assertions,全名和縮寫名有同樣的功能。

參數 -ea和-ea:

它們含義為開啟(關閉)用戶類的assertion功能:通過這個參數,用戶可以打開某些類或包的assertion功能,同樣用戶也可以關閉某些類和包的assertion功能。打開assertion功能參數為-ea;如果不帶任何參數,表示打開所有用戶類;如果帶有包名稱或者類名稱,表示打開這些類或包;如果包名稱后面跟有三個點,代表這個包及其子包;如果只有三個點,代表無名包。關閉assertion功能參數為-da,使用方法與-ea類似。

-ea和-da的全名為-enable assertions和-disenable assertions,全名和縮寫名有同樣的功能。

下面表格表示了參數及其含義,并有例子說明如何使用。

參數 例子 說明

參數 例子 說明
-ea java -ea 打開所有用戶類的assertion
-da java -da 關閉所有用戶類的assertion
-ea:<classname> java -ea:MyClass1 打開MyClass1的assertion
-da:<classname> java -da: MyClass1 關閉MyClass1的assertion
-ea:<packagename> java -ea:pkg1 打開pkg1包的assertion
-da:<packagename> java -da:pkg1 關閉pkg1包的assertion
-ea:... java -ea:... 打開缺省包(無名包)的assertion
-da:... java -da:... 關閉缺省包(無名包)的assertion
-ea:<packagename>... java -ea:pkg1... 打開pkg1包和其子包的assertion
-da:<packagename>... java -da:pkg1... 關閉pkg1包和其子包的assertion
-esa java -esa 打開系統類的assertion
-dsa java -dsa 關閉系統類的assertion
綜合使用 java -dsa:MyClass1:pkg1 關閉MyClass1和pkg1包的assertion

其中...代表,此包和其子包的含義。例如我們有兩個包為pkg1和pkg1.subpkg。那么pkg1...就代表pkg1和pkg1.subpkg兩個包。

另外,Java為了讓程序也能夠動態開啟和關閉某些類和包的assertion功能,Java修該了Class和ClassLoader的實現,增加了幾個用于操作assert的API。下面簡單說明一下幾個API的作用。

ClassLoader類中的幾個相關的API:

  setDefaultAssertionStatus:用于開啟/關閉assertion功能

  setPackageAssertionStatus:用于開啟/關閉某些包的assertion功能

  setClassAssertionStatus: 用于開啟/關閉某些類的assertion功能

  clearAssertionStatus:用于關閉assertion功能


二、assertion的設計問題

首先,我們認為assertion是必要的。因為,如果沒有統一的assertion機制,Java程序通常使用if-then-else或者switch-case語句進行assertion檢查,而且檢查的數據類型也不完全相同。assertion機制讓Java程序員用統一的方式處理assertion問題,而不是按自己的方式處理。另外,如果用戶使用自己的方式進行檢查,那么這些代碼在發布以后仍然將起作用,這可能會影響程序的性能。而從語言言層次支持assertion功能,這將把assertion對性能帶來的負面影響降到最小。

Java是通過增強一個關鍵字assert實現支持assertion,而不是使用一個庫函數支持,這說明Java認為assertion對于語言本身來說是非常重要的。實際上,在Java的早期的規范中,Java是能夠支持assert的,但是由于一些實現的限制,這些特性從規范中除去了。因此,assert的再次引入應該是恢復了Java對assert的支持。C語言就是通過Assert.h函數庫實現斷言的支持。

Java的assertion的開啟也和C語言不太一樣,我們都知道在C語言中,assertion的開啟是在編譯時候決定的。當我們使用debug方式編譯程序時候,assertion被開啟,而使用release方式編譯時候,assertion自動被關閉。而Java的assertion卻是在運行的時候進行決定的。其實,這兩種方式是各有優缺點。如果采用編譯時決定方式,開發人員將處理兩種類型的目標碼,debug版本和release版本,這加大了文檔管理的難度,但是提高了代碼的運行效率。Java采用運行時決定的方式,這樣所有的assertion信息將置于目標代碼中,同一目標代碼可以選擇不同方式運行,增強目標代碼的靈活性,但是它將犧牲因為assertion而引起一部分性能損失。Java專家小組認為,所犧牲的性能相當小,因此java采用了運行時決定方式。

另外,我們注意到AssertionError作為Error的一個子類,而不是RuntimeException。關于這一點,專家組也進行了長期的討論。Error代表一些異常的錯誤,通常是不可以恢復的,而RuntimeException強調該錯誤在運行時才發生的特點。AssertionError通常為非常關鍵的錯誤,這些錯誤往往是不容易恢復的,而且assertion機制也不鼓勵程序員對這種錯誤進行恢復。因此,為了強調assertion的含義,Java專家小組選擇了讓AssertError為Error的子類。


assertion與繼承

在本節,我們將考慮assertion與繼承的關系,研究assert是如何定位的。如果開啟一個子類的assertion,那么它的父類的assertion是否執行?

下面的例子將顯示如果一個assert語句在父類,而當它的子類調用它時,該assert為false。我們看看在不同的情況下,該assertion是否被處理。

class Base

{

? ? public void baseMethod()?? {

? ? ? ? assert? ?? ?false : "Assertion failed:This is base "; ???// 總是assertion失敗

? ? ? ? System.out.println("Base Method");

??}

}

class Derived?extends Base?{

? ? public void derivedMethod()??{

? ? ? ? assert false: "Assertion failed:This is derive"; ? ? ??// 總是assertion失敗

? ? ? ? System.out.println( "Derived Method" );

??}

??public static void main( String[] args )??{

? ? try??{

? ? ? ? ? Derived derived = new Derived();

? ? ? ? ? derived.baseMethod(??);

? ? ? ? ? derived.derivedMethod();

? ? }??catch( AssertionError ae )??{

? ? ? ? ? System.out.println(ae);

? ? }

??}

}

運行命令 含義 結果

Java?Derived?不啟用assertion?

Base Method

Derived Method

Java -ea Derived?開啟所有assertion?

Java.lang.AssertionError:Assertion Failed:This is base

Java -da Derived?關閉所有assertion?

Base Method

Derived Method

Java -ea:Base Derived?僅打開Base的assertion?

Java.lang.AssertionError:Assertion Failed:This is base

Java -ea:Derived Derived??僅打開Derived的assertion?

Base Method

Java.lang.AssertionError:Assertion Failed:This is derived

從這個例子我們可以看出,父類的assert語句將只有在父類的assert開啟才起作用,如果僅僅開啟子類的assert,父類的assert仍然不運行。例如,我們執行java -ea:Derived Derived的時候,Base類的assert語句并不執行。因此,我們可以認為,assert語句不具有繼承功能


assertion的使用

assertion的使用是一個復雜的問題,因為這將涉及到程序的風格,assertion運用的目標,程序的性質等問題。通常來說,assertion用于檢查一些關鍵的值,并且這些值對整個程序,或者局部功能的完成有很大的影響,并且這種錯誤不容易恢復的。assertion表達式應該短小、易懂,如果需要評估復雜的表達式,應該使用函數計算。以下是一些使用assertion的情況的例子,這些方式可以讓java程序的可靠性更高。

檢查控制流; 在if-then-else和swith-case語句中,我們可以在不應該發生的控制支流上加上assert false語句。如果這種情況發生了,assert能夠檢查出來。

例如:x取值只能使1,2,3,我們的程序可以如下表示

? ? ? ? switch (x)??{?

? ? ? ? ??case 1: …;

? ?? ?? ? case 2: …;

? ?? ?? ? case 3: …

? ? ? ?? ?default: assert false : "x value is invalid: "+x;

}

在私有函數計算前,檢查輸入參數是否有效;對于一私有些函數,要求輸入滿足一些特定的條件,那么我們可以在函數開始處使用assert進行參數檢查。對于公共函數,我們通常不使用assertion檢查,因為一般來說,公共函數必須對無效的參數進行檢查和處理。而私有函數往往是直接使用的

例如:某函數可能要求輸入的參數必須不為null。那么我們可以在函數的一開始加上?assert parameter1!=null : "paramerter is null in test method";

在函數計算后,檢查函數結果是否有效;對于一些計算函數,函數運行完成后,某些值需要保證一定的性質,因此我們可以通過assert檢查該值。

例如,我們有一個計算絕對值的函數,那么我們就可以在函數的結果處,加上一個語句:

assert??value>=0:"Value should be bigger than 0:"+value;

通過這種方式,我們可以對函數計算完的結果進行檢查。

檢查程序不變量;有些程序中,存在一些不變量,在程序的運行生命周期,這些不變量的值都是不變的。這些不變量可能是一個簡單表達式,也可能是一個復雜的表達式。對于一些關鍵的不變量,我們可以通過assert進行檢查。

例如,在一個財會系統中,公司的支出和收入必須保持一定的平衡關系,因此我們可以編寫一個表達式檢查這種平衡關系,如下表示。

? ?? ?? ? private boolean isBalance() {

? ?? ?? ???……

? ?? ?? ?}

在這個系統中,在一些可能影響這種平衡關系的方法的前后,我們都可以加上assert驗證:assert isBalance():"balance is destoried";


結論

assertion為開發人員提供了一種靈活地調試和測試機制,它的使用也非常簡單、方便。但是,如何規范、系統地使用assertion(特別是在Java語言中)仍然是一個亟待研究的問題。


參考資料:

JSR 41 A Simple Assertion Facility

http://jcp.org/jsr/detail/41.jsp

Wm. Paul Rogers, J2SE 1.4 premieres Java’s assertion capabilities

http://www.javaworld.com/javaworld/jw-11-2001/jw-1109-assert.html?

J2SE 1.4 Documents, Programming With Assertions

http://java.sun.com/j2se/1.4/docs/guide/lang/assert.html

John Zukowski, Mastering Java 2, J2SE 1.4?




參考推薦:

Java assertion完美經典教程??

斷言(assert宏)的副作用

java assert


from:?http://blog.csdn.net/ithomer/article/details/9185125

總結

以上是生活随笔為你收集整理的Java assertion 介绍和用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品一区二区三区不卡 | 欧美日韩在线中文字幕 | 日韩91 | 日韩精品一区二区电影 | 亚洲区自拍 | 五十路熟母 | 黄色伊人 | jizz亚洲女人| 日本黄色片免费 | 天天操天天弄 | www国产精品内射熟女 | 国产精品成人无码 | 国产高清一区二区三区 | 亚洲专区一区二区三区 | 国产精品一区二区在线 | 天天躁日日躁狠狠躁 | 一级黄色a级片 | 亚洲综合图片网 | 国产一区二区黑人欧美xxxx | 日本免费黄色小视频 | 国产一区二区在线播放视频 | 巨乳在线播放 | 日本美女a级片 | 久久久精品一区二区三区 | 精品一区欧美 | 性欧美巨大乳 | 爱涩av| 亚洲女优一区 | 干日本少妇 | 久久最新视频 | 国产亚洲成av人在线观看导航 | 国产精品国产三级国产三级人妇 | 成人精品一区二区 | 97超碰在线资源 | 日本欧美色图 | 欧美黄色一级片视频 | 丰满的女邻居 | a级片免费在线观看 | 可以免费观看的av网站 | 国产精品成人Av | 黄色性大片| 色女生影院 | 韩日中文字幕 | 欧美日一区二区三区 | 一级片免费观看视频 | av激情久久 | 美女被草视频 | 十八禁视频网站在线观看 | 亚洲成年人影院 | 日韩av高清在线播放 | 一个色在线 | 免费午夜人成电影 | 欧美日韩高清一区二区 国产亚洲免费看 | 天天操女人 | 51成人网 | 久久久综合视频 | 久久国产热 | 国产在线成人精品午夜 | 亚洲一区二区三区婷婷 | 久久久久久久久久久久97 | 国产一区免费视频 | 四虎影视黄色 | 亚洲视频在线观看一区二区三区 | 韩国三级在线看 | 免费在线观看一区二区三区 | 亚洲精品一区二区三区四区五区 | 欧美肥老妇 | 国产草草视频 | 99热.com| 91视频国产精品 | 亚洲色图一区二区 | 国产精品18久久久久久无码 | 日韩激情网站 | 欧美日韩久久精品 | 99久久婷婷国产综合精品电影 | 国产淫语 | 日本三级吹潮 | 97操操| 国产欧美精品久久 | 亚洲美女视频网站 | 日韩美女av在线 | 激情四月 | 成人在线观看一区二区三区 | 2023毛片 | 国产免费一区二区三区网站免费 | 黑人操亚洲人 | 亚洲天堂影视 | 天天做天天摸天天爽天天爱 | 91视频国产一区 | 最近的中文字幕 | 亚洲免费中文字幕 | 国产午夜亚洲精品午夜鲁丝片 | 99激情视频| 日本欧美在线视频 | 中国一级特黄毛片大片 | 福利小视频在线 | 一个人在线观看免费视频www | 黑白配高清国语在线观看 | 黄色三级a |