Java斷言

斷言概述

編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設

可以將斷言看作是異常處理的一種高級形式

斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真

可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新起用斷言。

使用斷言可以創建更穩定,品質更好且易于除錯的代碼

當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言

單元測試必須使用斷言(Junit/JunitX)

除了類型檢查和單元測試外,斷言還提供了一種確定個種特性是否在程序中得到維護的極好的方法

使用斷言使我們向按契約式設計更近了一部

常見的斷言特性

前置條件斷言:代碼執行之前必須具備的特性

后置條件斷言:代碼執行之后必須具備的特性

前后不變斷言:代碼執行前后不能變化的特性

斷言使用方式

斷言可以有兩種形式

1.assert Expression1

2.assert Expression1:Expression2

其中Expression1應該總是一個布爾值,Expression2是斷言失敗時輸出的失敗消息的字符串。如果Expression1為假,則拋出一個 AssertionError,這是一個錯誤,而不是一個異常,也就是說是一個不可控制異常(unchecked Exception),AssertionError由于是錯誤,所以可以不捕獲,但不推薦這樣做,因為那樣會使你的系統進入不穩定狀態。

起用斷言

斷言在默認情況下是關閉的,要在編譯時啟用斷言,需要使用source1.4標記 既javac source1.4 Test.java ,在運行時啟用斷言需要使用 -ea參數 。要在系統類中啟用和禁用斷言可以使用 -esa 和 -dsa參數。

例如:

public class AssertExampleOne{

public AssertExampleOne(){}

public static void main(String args[]){

int x=10;

System.out.println("Testing Assertion that x==100");

assert x==100:"Out assertion failed!";

System.out.println("Test passed!");

}

}

如果編譯時未加 -source1.4,則編譯通不過

在執行時未加 -ea 時輸出為

Testing Assertion that x==100

Test passed

jre忽略了斷言的就代碼,而使用了該參數就會輸出為

Testing Assertion that x==100

Exception in thread "main" java.lang.AssertionError: Out assertion failed!

at AssertExampleOne.main(AssertExampleOne.java:6)

斷言的副作用

由于程序員的問題,斷言的使用可能會帶來副作用 ,例如:

boolean isEnable=false;

//...

assert isEnable=true;

這個斷言的副作用是因為它修改了程序中變量的值并且未拋出錯誤,這樣的錯誤如果不細心的檢查是很難發現的。但是同時我們可以根據以上的副作用得到一個有用的特性,根據它來測試斷言是否打開。

public class AssertExampleTwo{

public static void main(String args[]){

boolean isEnable=false;

//...

assert isEnable=true;

if(isEnable==false){

throw new RuntimeException("Assertion shoule be enable!");

}

}

}

何時需要使用斷言

1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false

2.斷言可以用于檢查傳遞給私有方法的參數。(對于公有方法,因為是提供給外部的接口,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性)

3.使用斷言測試方法執行的前置條件和后置條件

4.使用斷言檢查類的不變狀態,確保任何情況下,某個變量的狀態必須滿足。(如age屬性應大于0小于某個合適值)

什么地方不要使用斷言

斷言語句不是永遠會執行,可以屏蔽也可以啟用

因此:

1.不要使用斷言作為公共方法的參數檢查,公共方法的參數永遠都要執行

2.斷言語句不可以有任何邊界效應,不要使用斷言語句去修改變量和改變方法的返回值

參考:

http://jcp.org/en/jsr/detail?id=41

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

http://www-128.ibm.com/developworkers/cn/java/jdiag0723/

http://www-128.ibm.com/developworkers/cn/java/jmerlin/part9/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 用途 使用斷言可以創建更穩定,品質更好且易于除錯的代碼當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言單...
    妖云小離閱讀 447評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • 下面的內容是對網上原有的Java面試題集及答案進行了全面修訂之后給出的負責任的題目和答案,原來的題目中有很多重復題...
    獨念白閱讀 1,375評論 0 3
  • 更多 Java 基礎知識方面的文章,請參見文集《Java 基礎知識》 斷言是一種調試方式。若斷言失敗,拋出異常 A...
    專職跑龍套閱讀 886評論 0 0