日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java断言(assert)

發(fā)布時間:2025/3/21 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java断言(assert) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述?

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

二、語法?

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

assert關鍵字語法很簡單,有兩種用法:?

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

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

三、應用實例?

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

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

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

??????? //斷言2結果為false,程序終止?
??????? assert false : "斷言失敗,此表達式的信息將會在拋出異常的時候輸出!";?
??????? System.out.println("斷言2沒有問題,Go!");?
??? }?
}?

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

1、編譯程序:?
C:\>javac AssertFoo.java?

2、默認執(zhí)行程序,沒有開啟-ea開關:?
C:\>java AssertFoo?
斷言1沒有問題,Go!?

-----------------?

斷言2沒有問題,Go!?

3、開啟-ea開關,執(zhí)行程序:?
C:\>java -ea AssertFoo?
斷言1沒有問題,Go!?

-----------------?

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

四、陷阱?

assert關鍵字用法簡單,但是使用assert往往會讓你陷入越來越深的陷阱中。應避免使用。筆者經過研究,總結了以下原因:?

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

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

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


五、對assert的思考?

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

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

以上僅僅代表我個人觀點,歡迎大家留言討論。

?

-----------------------------------------------------------------------------------

下面是一些Assert的例子:

assert 0 < value;
assert 0 < value:"value="+value;
assert ref != null:"ref doesn''t equal null";
assert isBalanced();

?

-----------------------------------------------------------------------------------

AssertinError類是Error的直接子類,因此代表程序出現了嚴重的錯誤,這種異常通常是不需要程序員使用catch語句捕捉的。

?

使用assert的準則:assert語句的作用是保證程序內部的一致性,而不是用戶與程序之間的一致性,所以不應用在保證命令行參數的正確性??梢杂脕肀WC傳遞給private方法參數的正確性。因為私有方法只是在類的內部被調用,因而是程序員可以控制的,我們可以預期它的狀態(tài)是正確和一致的。公有方法則不適用。此外,assert語句可用于檢查任何方法結束時狀態(tài)的正確性,及在方法的開始檢查相關的初始狀態(tài) 等等。

?

assert語句并不構成程序正常運行邏輯的一部分,時刻記住在運行時它們可能不會被執(zhí)行。

?

-----------------------------------------------------------------------------------

兩類參數:
  參數 -esa和 -dsa:
  它們含義為開啟(關閉)系統(tǒng)類的assertion功能。由于新版本的Java的系統(tǒng)類中,也使了 assertion語句,因此如果用戶需要觀察它們的運行情況,就需要打開系統(tǒng)類的assertion功能 ,我們可使用-esa參數打開,使用 -dsa參數關閉。 -esa和-dsa的全名為-enablesystemassertions和-disenablesystemassertions,全名和縮寫名有同樣的功能。


  參數 -ea和 -ea:
  它們含義為開啟(關閉)用戶類的assertion功能:通過這個參數,用戶可以打開某些類或包的assertion功能,同樣用戶也可以關閉某些類和包的assertion功能。打開assertion功能參數為-ea;如果不帶任何參數,表示打開所有用戶類;如果帶有包名稱或者類名稱,表示打開這些類或包;如果包名稱后面跟有三個點,代表這個包及其子包;如果只有三個點,代表無名包。關閉 assertion功能參數為-da,使用方法與-ea類似。
  -ea和-da的全名為-enableassertions和-disenableassertions,全名和縮寫名有同樣的功能。
  下面表格表示了參數及其含義,并有例子說明如何使用。
  參數???? 例子????????????????????????? 說明
  -ea????? java -ea?????????????????? 打開所有用戶類的assertion
  -da????? java -da?????????????????? 關閉所有用戶類的assertion
  -ea:???? java -ea:MyClass1?? 打開MyClass1的assertion
  -da:???? java -da: MyClass1? 關閉MyClass1的assertion
  -ea:???? java -ea:pkg1????????? 打開pkg1包的assertion
  -da:???? java -da:pkg1??????????關閉pkg1包的assertion
  -ea:...? java -ea:...?????????????? 打開缺省包(無名包)的assertion
  -da:...? java -da:...?????????????? 關閉缺省包(無名包)的assertion
  -ea:...? java -ea:pkg1...???????打開pkg1包和其子包的assertion
  -da:...? java -da:pkg1...?????? 關閉pkg1包和其子包的assertion
  -esa??? java -esa???????????????? 打開系統(tǒng)類的assertion
  -dsa????java -dsa???????????????? 關閉系統(tǒng)類的assertion

?

-----------------------------------------------------------------------------------

不要再public的方法里面檢查參數是不是為null之類的操作,例如:

public?int get(String s){
??????assert?s != null;
}


如果需要檢查也最好通過 if s = null ?拋出 NullPointerException來檢查。

?
不要用assert來檢查方法操作的返回值來判斷方法操作的結果,例如:

assert list.removeAll();這樣看起來好像沒有問題 但是想想如果assert 被disable呢,那樣他就不會被執(zhí)行了,所以removeAll()操作就沒有被執(zhí)行,可以這樣代替
boolean boo = list.removeAl();
assert boo;

?

-----------------------------------------------------------------------------------

另外,Java為了讓程序也能夠動態(tài)開啟和關閉某些類和包的assertion功能,Java修該了Class和ClassLoader的實現,增加了幾個用于操作assert的API。下面簡單說明一下幾個API的作用。
ClassLoader類中的幾個相關的API:
  setDefaultAssertionStatus:用于開啟/關閉assertion功能
  setPackageAssertionStatus:用于開啟/關閉某些包的assertion功能
  setClassAssertionStatus: 用于開啟/關閉某些類的assertion功能
  clearAssertionStatus:用于關閉assertion功能?

?

from:?https://jiangzhengjun.iteye.com/blog/694886

總結

以上是生活随笔為你收集整理的Java断言(assert)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。