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

一、概述

在C和C++語言中都有assert關(guān)鍵,表示斷言。
在Java中,同樣也有assert關(guān)鍵字,表示斷言,用法和含義都差不多。

二、語法

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

assert關(guān)鍵字語法很簡單,有兩種用法:

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

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

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

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

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

下面給出一個例子,通過例子說明其用法:

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á)式的信息將會在拋出異常的時候輸出!";
    System.out.println("斷言2沒有問題,Go!");
}

}

保存代碼到C:\AssertFoo.java,然后按照下面的方式執(zhí)行,查看控制臺輸出結(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á)式的信息將
會在拋出異常的時候輸出!
at AssertFoo.main(AssertFoo.java:10)

四、陷阱

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

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

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

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

五、對assert的思考

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容