Java陷阱之a(chǎn)ssert關(guān)鍵字

一、概述

在C和C++語(yǔ)言中都有assert關(guān)鍵搅荞,表示斷言红氯。
在Java中,同樣也有assert關(guān)鍵字咕痛,表示斷言脖隶,用法和含義都差不多。

二暇检、語(yǔ)法

在Java中产阱,assert關(guān)鍵字是從JAVA SE 1.4 引入的,為了避免和老版本的Java代碼中使用了assert關(guān)鍵字導(dǎo)致錯(cuò)誤块仆,Java在執(zhí)行的時(shí)候默認(rèn)是不啟動(dòng)斷言檢查的(這個(gè)時(shí)候构蹬,所有的斷言語(yǔ)句都將忽略!)悔据,如果要開啟斷言檢查庄敛,則需要用開關(guān)-enableassertions或-ea來開啟。

assert關(guān)鍵字語(yǔ)法很簡(jiǎn)單科汗,有兩種用法:

1藻烤、assert <boolean表達(dá)式>

如果<boolean表達(dá)式>為true,則程序繼續(xù)執(zhí)行头滔。
如果為false怖亭,則程序拋出AssertionError,并終止執(zhí)行坤检。

2兴猩、assert <boolean表達(dá)式> : <錯(cuò)誤信息表達(dá)式>

如果<boolean表達(dá)式>為true,則程序繼續(xù)執(zhí)行早歇。
如果為false倾芝,則程序拋出java.lang.AssertionError讨勤,并輸入<錯(cuò)誤信息表達(dá)式>。

三晨另、應(yīng)用實(shí)例

下面給出一個(gè)例子潭千,通過例子說明其用法:

public class AssertFoo {
public static void main(String args[]) {
//斷言1結(jié)果為true,則繼續(xù)往下執(zhí)行
assert true;
System.out.println("斷言1沒有問題借尿,Go刨晴!");

    System.out.println("\n-----------------\n");

    //斷言2結(jié)果為false,程序終止
    assert false : "斷言失敗,此表達(dá)式的信息將會(huì)在拋出異常的時(shí)候輸出垛玻!";
    System.out.println("斷言2沒有問題,Go奶躯!");
}

}

保存代碼到C:\AssertFoo.java帚桩,然后按照下面的方式執(zhí)行,查看控制臺(tái)輸出結(jié)果:

1嘹黔、編譯程序:

C:>javac AssertFoo.java

2账嚎、默認(rèn)執(zhí)行程序,沒有開啟-ea開關(guān):

C:>java AssertFoo
斷言1沒有問題儡蔓,Go郭蕉!


斷言2沒有問題,Go喂江!

3召锈、開啟-ea開關(guān),執(zhí)行程序:
C:>java -ea AssertFoo
斷言1沒有問題获询,Go涨岁!


Exception in thread "main" java.lang.AssertionError: 斷言失敗,此表達(dá)式的信息將
會(huì)在拋出異常的時(shí)候輸出吉嚣!
at AssertFoo.main(AssertFoo.java:10)

四梢薪、陷阱

assert關(guān)鍵字用法簡(jiǎn)單,但是使用assert往往會(huì)讓你陷入越來越深的陷阱中尝哆。應(yīng)避免使用秉撇。筆者經(jīng)過研究,總結(jié)了以下原因:

1秋泄、assert關(guān)鍵字需要在運(yùn)行時(shí)候顯式開啟才能生效琐馆,否則你的斷言就沒有任何意義。而現(xiàn)在主流的Java IDE工具默認(rèn)都沒有開啟-ea斷言檢查功能恒序。這就意味著你如果使用IDE工具編碼啡捶,調(diào)試運(yùn)行時(shí)候會(huì)有一定的麻煩。并且奸焙,對(duì)于Java Web應(yīng)用瞎暑,程序代碼都是部署在容器里面彤敛,你沒法直接去控制程序的運(yùn)行,如果一定要開啟-ea的開關(guān)了赌,則需要更改Web容器的運(yùn)行配置參數(shù)墨榄。這對(duì)程序的移植和部署都帶來很大的不便。

2勿她、用assert代替if是陷阱之二袄秩。assert的判斷和if語(yǔ)句差不多,但兩者的作用有著本質(zhì)的區(qū)別:assert關(guān)鍵字本意上是為測(cè)試調(diào)試程序時(shí)使用的逢并,但如果不小心用assert來控制了程序的業(yè)務(wù)流程之剧,那在測(cè)試調(diào)試結(jié)束后去掉assert關(guān)鍵字就意味著修改了程序的正常的邏輯。

3砍聊、assert斷言失敗將面臨程序的退出背稼。這在一個(gè)生產(chǎn)環(huán)境下的應(yīng)用是絕不能容忍的。一般都是通過異常處理來解決程序中潛在的錯(cuò)誤玻蝌。但是使用斷言就很危險(xiǎn)蟹肘,一旦失敗系統(tǒng)就掛了。

五俯树、對(duì)assert的思考

assert既然是為了調(diào)試測(cè)試程序用帘腹,不在正式生產(chǎn)環(huán)境下用,那應(yīng)該考慮更好的測(cè)試JUint來代替其做用许饿,JUint相對(duì)assert關(guān)鍵的所提供的功能是有過之而無不及阳欲。當(dāng)然完全可以通過IDE debug來進(jìn)行調(diào)試測(cè)試。在此看來陋率,assert的前途一片昏暗胸完。

因此,應(yīng)當(dāng)避免在Java中使用assert關(guān)鍵字翘贮,除非哪一天Java默認(rèn)支持開啟-ea的開關(guān)赊窥,這時(shí)候可以考慮。對(duì)比一下狸页,assert能給你帶來多少好處锨能,多少麻煩,這是我們選擇是否使用的的原則芍耘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末址遇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斋竞,更是在濱河造成了極大的恐慌倔约,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝初,死亡現(xiàn)場(chǎng)離奇詭異浸剩,居然都是意外死亡钾军,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門绢要,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏恭,“玉大人,你說我怎么就攤上這事重罪∮:撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剿配,是天一觀的道長(zhǎng)搅幅。 經(jīng)常有香客問我,道長(zhǎng)呼胚,這世上最難降的妖魔是什么茄唐? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮砸讳,結(jié)果婚禮上琢融,老公的妹妹穿的比我還像新娘界牡。我一直安慰自己簿寂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布宿亡。 她就那樣靜靜地躺著常遂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挽荠。 梳的紋絲不亂的頭發(fā)上克胳,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音圈匆,去河邊找鬼漠另。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跃赚,可吹牛的內(nèi)容都是我干的笆搓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纬傲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼满败!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叹括,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤算墨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汁雷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净嘀,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡报咳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了面粮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片少孝。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熬苍,靈堂內(nèi)的尸體忽然破棺而出稍走,到底是詐尸還是另有隱情,我是刑警寧澤柴底,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布婿脸,位于F島的核電站,受9級(jí)特大地震影響柄驻,放射性物質(zhì)發(fā)生泄漏狐树。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一鸿脓、第九天 我趴在偏房一處隱蔽的房頂上張望抑钟。 院中可真熱鬧,春花似錦野哭、人聲如沸在塔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛔溃。三九已至,卻和暖如春篱蝇,著一層夾襖步出監(jiān)牢的瞬間贺待,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工零截, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麸塞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓涧衙,卻偏偏與公主長(zhǎng)得像哪工,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容