Java學(xué)習(xí)

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對(duì)文章有任何疑問(wèn)或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂(lè)園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

           

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

          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來(lái)開啟。
           
          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è)例子,通過(guò)例子說(shuō)明其用法:
           
          public class AssertFoo {
              public static void main(String args[]) {
                  //斷言1結(jié)果為true,則繼續(xù)往下執(zhí)行
                  assert true;
                  System.out.println("斷言1沒(méi)有問(wèn)題,Go");
           
                  System.out.println("\n-----------------\n");
           
                  //斷言2結(jié)果為false,程序終止
                  assert false : "斷言失敗,此表達(dá)式的信息將會(huì)在拋出異常的時(shí)候輸出!";
                  System.out.println("斷言2沒(méi)有問(wèn)題,Go");
              }
          }
           
          保存代碼到C:\AssertFoo.java,然后按照下面的方式執(zhí)行,查看控制臺(tái)輸出結(jié)果:
           
          1、編譯程序:
          C:\>javac AssertFoo.java
           
          2、默認(rèn)執(zhí)行程序,沒(méi)有開啟-ea開關(guān):
          C:\>java AssertFoo
          斷言1沒(méi)有問(wèn)題,Go!
           
          -----------------
           
          斷言2沒(méi)有問(wèn)題,Go!
           
          3、開啟-ea開關(guān),執(zhí)行程序:
          C:\>java -ea AssertFoo
          斷言1沒(méi)有問(wèn)題,Go!
           
          -----------------
           
          Exception in thread "main" java.lang.AssertionError: 斷言失敗,此表達(dá)式的信息將
          會(huì)在拋出異常的時(shí)候輸出!
                  at AssertFoo.main(AssertFoo.java:10)
           
          四、陷阱
           
          assert關(guān)鍵字用法簡(jiǎn)單,但是使用assert往往會(huì)讓你陷入越來(lái)越深的陷阱中。應(yīng)避免使用。筆者經(jīng)過(guò)研究,總結(jié)了以下原因:
           
          1、assert關(guān)鍵字需要在運(yùn)行時(shí)候顯式開啟才能生效,否則你的斷言就沒(méi)有任何意義。而現(xiàn)在主流的Java IDE工具默認(rèn)都沒(méi)有開啟-ea斷言檢查功能。這就意味著你如果使用IDE工具編碼,調(diào)試運(yùn)行時(shí)候會(huì)有一定的麻煩。并且,對(duì)于Java Web應(yīng)用,程序代碼都是部署在容器里面,你沒(méi)法直接去控制程序的運(yùn)行,如果一定要開啟-ea的開關(guān),則需要更改Web容器的運(yùn)行配置參數(shù)。這對(duì)程序的移 植和部署都帶來(lái)很大的不便。
           
          2、用assert代替if是陷阱之二。assert的判斷和if語(yǔ)句差不多,但兩者的作用有著本質(zhì)的區(qū)別:assert關(guān)鍵字本意上是為測(cè)試 調(diào)試程序時(shí)使用的,但如果不小心用assert來(lái)控制了程序的業(yè)務(wù)流程,那在測(cè)試調(diào)試結(jié)束后去掉assert關(guān)鍵字就意味著修改了程序的正常的邏輯。
           
          3、assert斷言失敗將面臨程序的退出。這在一個(gè)生產(chǎn)環(huán)境下的應(yīng)用是絕不能容忍的。一般都是通過(guò)異常處理來(lái)解決程序中潛在的錯(cuò)誤。但是使用斷言就很危險(xiǎn),一旦失敗系統(tǒng)就掛了。
           
           
          五、對(duì)assert的思考
           
          assert既然是為了調(diào)試測(cè)試程序用,不在正式生產(chǎn)環(huán)境下用,那應(yīng)該考慮更好的測(cè)試JUint來(lái)代替其做用,JUint相對(duì)assert關(guān)鍵的所提供的功能是有過(guò)之而無(wú)不及。當(dāng)然完全可以通過(guò)IDE debug來(lái)進(jìn)行調(diào)試測(cè)試。在此看來(lái),assert的前途一片昏暗。
           
          因此,應(yīng)當(dāng)避免在Java中使用assert關(guān)鍵字,除非哪一天Java默認(rèn)支持開啟-ea的開關(guān),這時(shí)候可以考慮。對(duì)比一下,assert能給你帶來(lái)多少好處,多少麻煩,這是我們選擇是否使用的的原則。

          posted on 2008-07-16 15:06 找個(gè)美女做老婆 閱讀(1092) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桐柏县| 泸西县| 仙居县| 临洮县| 宣恩县| 房山区| 漳浦县| 秀山| 即墨市| 保靖县| 木兰县| 沅江市| 沾益县| 保康县| 南部县| 越西县| 罗城| 印江| 泽普县| 乡宁县| 鄂尔多斯市| 雅江县| 远安县| 永仁县| 巫溪县| 吉安县| 伊金霍洛旗| 利津县| 司法| 洪雅县| 淮滨县| 基隆市| 玛纳斯县| 江口县| 阿尔山市| 华坪县| 昌图县| 聂荣县| 平凉市| 乌鲁木齐市| 德江县|