1. 程式人生 > >java中assert關鍵字

java中assert關鍵字

Java2在1.4中新增了一個關鍵字:assert。在程式開發過程中使用它建立一個斷言(assertion)。,它的語法形式有如下所示的兩種形式:
1、assert condition;
    這裡condition是一個必須為真(true)的表示式。如果表示式的結果為true,那麼斷言為真,並且無任何行動
如果表示式為false,則斷言失敗,則會丟擲一個AssertionError物件。這個AssertionError繼承於Error物件,
而Error繼承於Throwable,Error是和Exception並列的一個錯誤物件,通常用於表達系統級執行錯誤。
2、asser condition:expr;


    這裡condition是和上面一樣的,這個冒號後跟的是一個表示式,通常用於斷言失敗後的提示資訊,說白了,它是一個傳到AssertionError建構函式的值,如果斷言失敗,該值被轉化為它對應的字串,並顯示出來。

用一個例子說明一下:

public class Test {
    public static void main(String[] args) {
        System.out.println("start");
        assert true;
System.out.println("go on");
        assert false:"stop"
; System.out.println("end"); } }
這裡有一個測試類,通過之前簡單的語法介紹後,可以這樣簡單的理解這個例子:

當程式執行到assert true這一句時,condition為true,系統會繼續執行下去。而後執行到 assert false:"stop"的時候,由於condition=false,系統會丟擲AssertionError。

但是試試上是不是這樣的呢?

看看執行結果就知道了

start
go on
end

這個執行結果和我們一開始的預期不一致,問題出在哪裡了?

原來java的斷言與C語言中的斷言還有有些不同的地方。

Java的assertion的開啟也和C語言不太一樣,在C語言中,assertion的開啟是在編譯時候決定的

。當我們使用debug方式編譯程式時候,assertion被開啟,而使用release方式編譯時候,assertion自動被關閉。  而Java的assertion卻是在執行的時候進行決定的。其實,這兩種方式是各有優缺點。如果採用編譯時決定方式,開發人員將處理兩種型別的目標碼,debug版本和release版本,這加大了文件管理的難度,但是提高了程式碼的執行效率。  Java採用執行時決定的方式,這樣所有的assertion資訊將置於目的碼 中,同一目的碼可以選擇不同方式執行,增強目的碼的靈活性,但是它將犧牲因為assertion而引起一部分效能損失。    

說直白一點就是:assert關鍵字需要在執行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。

如果需要觀察斷言的執行情況,就需要開啟系統類的assertion功能 ,我們可使用-esa引數開啟,使用 -dsa引數關閉。  -esa和-dsa的全名為-enablesystemassertions和 -disenablesystemassertions,全名和縮寫名有同樣的功能。

我們還是用剛剛那個測試方法,再執行試試看:


當我們只是通過java命令編譯、執行測試方法時,並沒有執行assert語句;然而通過java -ea Test命令顯示開啟assertion功能後,發現系統確實執行了assert語句。

另外,我們注意到體統丟擲的是AssertionError,作為Error的一個子類,而不是 RuntimeException。Error代表一些異常的錯誤,通常是不可以恢復的,而 RuntimeException強調該錯誤在執行時才發生的特點。AssertionError通常為非常關鍵的錯誤,這些錯誤往往是不容易恢復的,而且assertion機制也不鼓勵程式設計師對這種錯誤進行恢復。

通過這個實驗的現象,可以引發一些思考:

1.assert需要顯示的開啟生效才有作用。

這就意味著你如果使用IDE工具編碼,除錯執行時候會有一定的麻煩,因為基本上java IDE都是沒有開啟斷言功能的。並且,對於Java Web應用,程式程式碼都是部署在容器裡面,你沒法直接去控制程式的執行,如果一定要開啟-ea的開關,則需要更改Web容器的執行配置引數。這對程式的移植和部署都帶來很大的不便。

2.assert斷言失敗將面臨程式的退出。這在一個生產環境下的應用是絕不能容忍的。一般都是通過異常處理來解決程式中潛在的錯誤。但是使用斷言就很危險,一旦失敗系統就掛了。

3.即使處理了Error,如果斷言的程式碼嵌入到業務流程中,一旦assert失效,也就改變了正常的業務邏輯(如果condition中加入了賦值等操作)。

我想可能就是這些原因導致平時的java開發中幾乎不會用到assert關鍵字,即便如此,JDK中還是存在不少使用assert的地方,比方說java.util.Locale類等

4.是不是可用通過封裝一些方法,自己來完成斷言的功能,既使用簡單,又方便理解。至少我是這樣做的。

相關推薦

javaassert關鍵字

Java2在1.4中新增了一個關鍵字:assert。在程式開發過程中使用它建立一個斷言(assertion)。,它的語法形式有如下所示的兩種形式:1、assert condition;    這裡condition是一個必須為真(true)的表示式。如果表示式的結果為tru

Javaassert關鍵字的實現

J2SE 1.4在語言上提供了一個新特性,就是assertion(斷言)功能,它是該版本在Java語言方面最大的革新。在軟體開發中,assertion是一種經典的除錯、測試方式。        assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都

JAVAthis關鍵字的用法

blog http tro font return his 局部變量 .com str this關鍵字主要有三個應用: 1.調用本類中的屬性,也就是類的成員變量; 2.調用本類中的其他方法; 3.調用本類中的其他構造方法,調用時候要放在構造方法的首行。 * this關鍵

就是要你懂Javavolatile關鍵字實現原理

stub string home 技術分享 訪問速度 get 地址傳遞 code 緩沖 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之

javavolatile關鍵字的含義

能夠 system 內存區域 退出 tro 技術 2.4 虛擬機 們的 在java線程並發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多線程並發處理的時候就可以萬事大吉。 Java語言是支持多線程的,為了解決線程並發的問題,在語

Javastatic關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

Javainstanceof關鍵字的用法總結

animal copy false 運算 erl 一個 strong 以及 繼承 instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,

[轉] javavolatile關鍵字的含義

讀取 add 由於 tar 並不是 ges 內部 post 計數 在java線程並發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多線程並發處理的時候就可以萬事大吉。 Java語言是支持多線程的,為了解決線程並發的問題,在

Javasynchronized關鍵字理解

監視器 pre 定義 exc 執行 zed 三種 gen 好記性不如爛筆頭 好記性不如爛筆頭~~ 並發編程中synchronized關鍵字的地位很重要,很多人都稱它為重量級鎖。利用synchronized實現同步的基礎:Java中每一個對象都可以作為鎖。具體表現為以下三種形

Javainstanceof關鍵字的用法

m60 cin .com 關鍵字 adr www. zdb kms http f72o1u前盞彜渦踴促http://shequ.docin.com/mym827424fzhy9晨撈晨詡鷗淹http://www.docin.com/rww41025xh82bc僭攀潭倜歡稱ht

Javavolatile關鍵字實現原理

三級 poll 解讀 內存屏障 就會 主存 發生 調用 獲得 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之間的可見性,它是ja

隨筆② 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.方法名() 子類構

Javathis關鍵字的使用

成員變量 用法 表示 當前 重載 說明 可讀性 舉例 調用構造 說明:this用於指向調用該方法的當前對象。 用法: 1. this.成員變量 ------ 表示訪問當前對象的成員變量 2. this() ------

javafinal關鍵字

成員變量 子類 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

解析Javafinal關鍵字的各種用法

col 後序 blog str 訪問 人類 依然 fin 可能 首先,我們可以從字面上理解一下final這個英文單詞的中文含義:“最後的,最終的; 決定性的; 不可更改的;”。顯然,final關鍵詞如果用中文來解釋,“不可更改的”更為合適。當你在編寫程序,可能

幹貨——詳解Java關鍵字

java虛擬機 color bsp cfi 為什麽 max main spa 不能 在平時編碼中,我們可能只註意了這些static,final,volatile等關鍵字的使用,忽略了他們的細節,更深層次的意義。 本文總結了Java中所有常見的關鍵字以及一些例子。

Javastatic關鍵字解析

地方 通過 特性 inf 優化 href compare 筆試 star Java中的static關鍵字解析   static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static