一、概述
在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能給你帶來多少好處锨能,多少麻煩,這是我們選擇是否使用的的原則芍耘。