最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年09月05日 16:16:54   作者:  
這篇文章詳細(xì)介紹了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)用實例
 
下面給出一個例子,通過例子說明其用法:

復(fù)制代碼 代碼如下:

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)鍵字需要在運行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。而現(xiàn)在主流的Java IDE工具默認(rèn)都沒有開啟-ea斷言檢查功能。這就意味著你如果使用IDE工具編碼,調(diào)試運行時候會有一定的麻煩。并且,對于Java Web應(yīng)用,程序代碼都是部署在容器里面,你沒法直接去控制程序的運行,如果一定要開啟-ea的開關(guān),則需要更改Web容器的運行配置參數(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能給你帶來多少好處,多少麻煩,這是我們選擇是否使用的的原則。

============================================================
comment:
反過來說,在某些開源組件中,比如validator、junit中,判斷過程仿佛使用了斷言風(fēng)格,很有可能使用了大量的斷言,但筆者在沒看源碼之前不能確定。
如果是開發(fā)階段的簡單測試,junit就是一個便捷強悍的工具,沒有理由自己寫斷言而不去用它。

============================================================
comment:
首先可以用在單元測試代碼中。junit侵入性是很強的,如果整個工程大量的代碼都使用了junit,就難以去掉或者是選擇另外一個框架。如果單元測試代碼 很多,并且想復(fù)用這些單元測試案例,應(yīng)該選擇assert而不是junit,便于使用別的單元測試框架,比如TestNG。同理正式的功能代碼根本就不應(yīng) 該出現(xiàn)Junit,應(yīng)該使用assert.

assert主要適合在基類,框架類,接口類,核心代碼類,工具類中。換言之,當(dāng)你的代碼的調(diào)用者是另外一個程序員寫得業(yè)務(wù)代碼,或者是另外一個子系統(tǒng)時,就很有必要使用它。比如你做了一個快速排序的算法

復(fù)制代碼 代碼如下:

public static List<int> quickSort(List<int> list){
  assert list != null;
  // 申請臨時空間
  //開始排序
  for(int i : list){
      //
  }
}

這種情況下,如果不檢查傳入?yún)?shù)的正確性,會拋出一個莫名其妙的空指針錯誤。你的調(diào)用者可能并不清楚你代碼的細(xì)節(jié),在一個系統(tǒng)的深處調(diào)試一個空指針錯誤是很浪費時間的。就應(yīng)該直接明確的告訴你的調(diào)用者是傳入的參數(shù)有問題。否則他會懷疑你的代碼有BUG。使用assert可以避免兩個程序員之間互相指責(zé)對方寫的代碼有問題。

assert適用那些你知道具體是什么錯誤,你和你的調(diào)用者已經(jīng)約定應(yīng)該由你的調(diào)用者去排除或檢查的錯誤。你通過一個斷言告訴你的調(diào)用者。assert不適用那些外部系統(tǒng)造成的錯誤,比如用戶輸入數(shù)據(jù)的錯誤,某個外部文件格式錯誤。這些錯誤不是你的調(diào)用者而是用戶造成的,甚至于不屬于異常,因為出現(xiàn)輸入錯誤和文件格式錯誤是經(jīng)常的,這些錯誤應(yīng)該由業(yè)務(wù)代碼去檢查。

assert比較適合于被頻繁調(diào)用的 基類,框架代碼,工具類,核心代碼,接口代碼中,這正是它在運行時被去掉的原因。測試代碼應(yīng)該在測試階段開啟-ea參數(shù),便于對系統(tǒng)深處的核心代碼做仔細(xì)的測試。

Java較少使用assert的原因是Java有很完整的OO體系,強制類型轉(zhuǎn)換出現(xiàn)得較少,所以不需要類似c那樣需要頻繁的檢查指針的類型是否正確,指針是否為空。同時Java也很少直接管理內(nèi)存或緩沖區(qū),所以不需要頻繁的檢查傳入的緩沖區(qū)是否為空或者是已經(jīng)越界。

但使用好assert有助于提高框架代碼的正確性和減少框架代碼的使用者的調(diào)試時間。

===============================================================
comment:
assert要達(dá)到的目的是讓程序員方便的發(fā)現(xiàn)自己的邏輯錯誤,并且不影響程序的效率。assert所發(fā)現(xiàn)的錯誤,是完全不應(yīng)該出現(xiàn)的,是不能用異常代替的。異常,那是系統(tǒng)所允許的,或者是系統(tǒng)不可控的“錯誤”,它不是程序員的邏輯問題。

assert應(yīng)該是開發(fā)階段打開,而在發(fā)布后關(guān)閉。

相關(guān)文章

  • java stream中Collectors的用法實例精講

    java stream中Collectors的用法實例精講

    這篇文章主要為大家介紹了java stream中Collectors的用法實例精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • springboot整合mybatis分頁攔截器的問題小結(jié)

    springboot整合mybatis分頁攔截器的問題小結(jié)

    springboot整合mybatis分頁攔截器,分頁攔截實際上就是獲取sql后將sql拼接limit,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Java 動態(tài)編譯在項目中的實踐分享

    Java 動態(tài)編譯在項目中的實踐分享

    在 Java 中,動態(tài)編譯是指在運行時動態(tài)地編譯 Java 源代碼,生成字節(jié)碼,并加載到 JVM 中執(zhí)行,動態(tài)編譯可以用于實現(xiàn)動態(tài)代碼生成、動態(tài)加載、插件化等功能,本文將給大家分享一下Java 動態(tài)編譯在項目中的實踐,感興趣的同學(xué)跟著小編一起來看看吧
    2023-07-07
  • Java8之lambda最佳實踐_動力節(jié)點Java學(xué)院整理

    Java8之lambda最佳實踐_動力節(jié)點Java學(xué)院整理

    在8 里面Lambda是最火的主題,不僅僅是因為語法的改變,更重要的是帶來了函數(shù)式編程的思想,我覺得優(yōu)秀的程序員,有必要學(xué)習(xí)一下函數(shù)式編程的思想以開闊思路
    2017-06-06
  • java發(fā)送郵件及打開狀態(tài)判斷分析實例

    java發(fā)送郵件及打開狀態(tài)判斷分析實例

    這篇文章主要為大家介紹了java發(fā)送郵件及打開狀態(tài)判斷分析實例
    2023-12-12
  • Java面試題沖刺第十一天--集合框架篇(2)

    Java面試題沖刺第十一天--集合框架篇(2)

    這篇文章主要為大家分享了最有價值的兩道集合框架的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • springboot整合ehcache 實現(xiàn)支付超時限制的方法

    springboot整合ehcache 實現(xiàn)支付超時限制的方法

    在線支付系統(tǒng)需要極高的穩(wěn)定性,在有限的系統(tǒng)資源下,穩(wěn)定性優(yōu)先級要高于系統(tǒng)并發(fā)以及用戶體驗,因此需要合理的控制用戶的支付請求。下面通過本文給大家介紹springboot整合ehcache 實現(xiàn)支付超時限制的方法,一起看看吧
    2018-01-01
  • java實習(xí)--每天打卡十道面試題!

    java實習(xí)--每天打卡十道面試題!

    臨近秋招,備戰(zhàn)暑期實習(xí),祝大家每天進(jìn)步億點點!本篇文章準(zhǔn)備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進(jìn)入自己心儀的大廠
    2021-06-06
  • 基于Java編寫一個簡單的內(nèi)部網(wǎng)段掃描程序

    基于Java編寫一個簡單的內(nèi)部網(wǎng)段掃描程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫一個簡單的內(nèi)部網(wǎng)段掃描程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下
    2025-02-02
  • java并發(fā)鎖的實現(xiàn)

    java并發(fā)鎖的實現(xiàn)

    Java中的鎖主要是為了解決多個線程訪問共享數(shù)據(jù)時的競爭問題,確保線程能夠安全地訪問和修改共享數(shù)據(jù),本文主要介紹了java并發(fā)鎖的實現(xiàn),感興趣的可以了解一下
    2024-04-04

最新評論

庄河市| 驻马店市| 永昌县| 肥东县| 寻乌县| 阳高县| 德化县| 洞头县| 闻喜县| 乌兰察布市| 白玉县| 灌云县| 丹凤县| 田阳县| 星子县| 夹江县| 右玉县| 武夷山市| 邮箱| 兖州市| 康乐县| 介休市| 九江市| 吉安市| 漯河市| 邹城市| 定安县| 临夏县| 武乡县| 岳西县| 鹤山市| 常宁市| 宁武县| 常州市| 常山县| 平湖市| 荔浦县| 扶风县| 宜宾市| 洞口县| 德保县|